2012-04-03 14 views
7

Po złożeniu wniosku gzip deflate w PHP, I otrzymać przebicia ciąg w offsetowych kawałki, które wygląda jak na poniższymJak rozszyfrować/nadąć struny gzip?

przykładu skróconej znacznie pokazać format:

00001B4E 
¾”kŒj…Øæ’ìÑ«F1ìÊ`+ƒQì¹UÜjùJƒZ\µy¡ÓUžGr‡J&=KLËÙÍ~=ÍkR 
0000102F 
ñÞœÞôΑüo[¾”+’Ñ8#à»0±R-4VÕ’n›êˆÍ.MCŽ…ÏÖr¿3M—èßñ°r¡\+ 
00000000 

jestem w stanie nadmuchać że prawdopodobnie ze względu na format porcji. Mogę potwierdzić, że dane nie są uszkodzone po ręcznym usunięciu przesunięć za pomocą edytora szesnastkowego i odczytaniu archiwum gzip. Zastanawiam się, czy istnieje właściwa metoda do przeanalizowania tej podzielonej odpowiedzi z gzipem na czytelny ciąg znaków?

Mogę być w stanie podzielić te przesunięcia i połączyć dane w jeden ciąg, aby wywołać gzinflate, ale wydaje się, że musi być łatwiejszy sposób.

Odpowiedz

9

prawidłowy sposób deflacja pakietowego odpowiedź jest z grubsza następująco:

initialise string to hold result 
for each chunk { 
    check that the stated chunk length equals the string length of the chunk 
    append the chunk data to the result variable 
} 

Oto przydatny funkcja PHP to zrobić dla ciebie (STAŁY):

function unchunk_string ($str) { 

    // A string to hold the result 
    $result = ''; 

    // Split input by CRLF 
    $parts = explode("\r\n", $str); 

    // These vars track the current chunk 
    $chunkLen = 0; 
    $thisChunk = ''; 

    // Loop the data 
    while (($part = array_shift($parts)) !== NULL) { 
    if ($chunkLen) { 
     // Add the data to the string 
     // Don't forget, the data might contain a literal CRLF 
     $thisChunk .= $part."\r\n"; 
     if (strlen($thisChunk) == $chunkLen) { 
     // Chunk is complete 
     $result .= $thisChunk; 
     $chunkLen = 0; 
     $thisChunk = ''; 
     } else if (strlen($thisChunk) == $chunkLen + 2) { 
     // Chunk is complete, remove trailing CRLF 
     $result .= substr($thisChunk, 0, -2); 
     $chunkLen = 0; 
     $thisChunk = ''; 
     } else if (strlen($thisChunk) > $chunkLen) { 
     // Data is malformed 
     return FALSE; 
     } 
    } else { 
     // If we are not in a chunk, get length of the new one 
     if ($part === '') continue; 
     if (!$chunkLen = hexdec($part)) break; 
    } 
    } 

    // Return the decoded data of FALSE if it is incomplete 
    return ($chunkLen) ? FALSE : $result; 

} 
+0

Doskonały, działa zgodnie z oczekiwaniami. Jest to przydatna funkcja PHP, której szukałem już od jakiegoś czasu. Wielkie dzięki! – user1309276

+0

@ user1309276 Zaktualizowałem powyższą funkcję, wystąpił błąd związany z zachowaniem, gdy ciąg zawiera literalną CRLF. Zostało to teraz naprawione, co również zapewnia lepsze wykrywanie zniekształconych ciągów. – DaveRandom

+0

Jeszcze raz dziękuję! Dla każdego, kto wciąż ma problemy, po wywołaniu unchunk_string wszystko, co muszę zrobić, to usunąć pierwsze 10 bajtów za pomocą: $ data = gzinflate (substr ($ data, 10)); – user1309276

0

Aby zdekodować użyć String gzinflate, Zend_Http_Client lib pomoże zrobić tego rodzaju wspólnych zadań, jego WASY użyć, sprawdź Zend_Http_Response code jeśli trzeba to zrobić na własnym

+0

Niestety, wypróbowałem już metodę, której używa lib, ale zawiera ona kod, który może być potrzebny w przyszłości, dzięki! – user1309276