определение того, содержит ли тело архивированные данные

#c #curl #gzip

#c #curl #gzip

Вопрос:

у меня есть программа, в которой она выполняет поиск в ответе на запрос curl определенных строк. иногда я получаю архивированные данные. есть ли способ определить, является ли ответ текстовым или в сжатом формате? заголовок иногда содержит сжатый заголовок deflate, но он не согласован. есть ли способ выполнить поиск в строке и определить, находится ли она в архивированном состоянии?

Ответ №1:

Вы могли бы попробовать взглянуть на первые два байта данных. Для сжатых данных они должны быть 0x1f, 0x8b.

 Member header and trailer

ID1 (IDentification 1)
ID2 (IDentification 2)
These have the fixed values ID1 = 31 (0x1f, 037), ID2 = 139 (0x8b, 213),
to identify the file as being in gzip format.
  

Комментарии:

1. ответ сохраняется в виде строки. итак, как действовать дальше?

2. if (строка[0] == 0x1f amp;amp; строка[1] == 0x8b) { бла-бла-бла;}

3. извините за поздний ответ, но когда я попробовал это сделать, он не соответствовал. когда я напечатал строку, она содержала весь неразборчивый язык или символы, кроме первых двух букв, где C и W .. итак, как мне действовать дальше?

Ответ №2:

Вы могли бы посмотреть на первые байты файла. Возможно, они содержат магическое число.

Ответ №3:

Формат файла gzip начинается с нескольких «волшебных байтов». Вы можете проверить, начинается ли тело с этих данных, и если это так, вставьте байты обратно в поток и начните разархивировать его.

Ответ №4:

Вы могли бы передать это через zcat, и если это не удается, используйте строку как есть. Я знаю, что это неаккуратно, но это должно быть надежно; обычный текстовый файл никогда не будет содержать действительные архивированные данные.

Ответ №5:

Соответствующие стандартам HTTP-ответы будут содержать заголовок Content-Encoding: или Transfer-Encoding:, указывающий «gzip» для сжатых ответов, что устраняет необходимость угадывать, глядя на магическое число. К сожалению, многие сайты неправильно отображают эти заголовки.