2012-04-03 8 views
7

PHP में एक gzip Deflate अनुरोध करने के बाद, मैं ऑफसेट मात्रा में पिचकाकर स्ट्रिंग प्राप्त है, जो निम्नलिखितएक चंकित gzip स्ट्रिंग को डीकोड/फुलाएं कैसे?

उदाहरण बहुत छोटा प्रारूप को दिखाने के लिए दिखाई देता है:

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 

मैं बढ़ाने के लिए है कि असमर्थ हूँ अनुमानित रूप से खंडित प्रारूप की वजह से। मैं हेक्स संपादक के साथ ऑफ़सेट को मैन्युअल रूप से हटाने और gzip संग्रह को पढ़ने के बाद डेटा दूषित नहीं कर सकता हूं। मैं सोच रहा हूं कि क्या एक पठनीय स्ट्रिंग में इस खंडित gzip deflated प्रतिक्रिया पार्स करने के लिए एक उचित विधि है?

मैं इन ऑफसेट को विभाजित करने और gzinflate को कॉल करने के लिए एक स्ट्रिंग में डेटा में शामिल होने में सक्षम हो सकता हूं, लेकिन ऐसा लगता है कि वहां एक आसान तरीका होना चाहिए।

उत्तर

9

उचित विधि एक chunked हवा निकालना करने पर यह सब करने की ज़रूरत प्रतिक्रिया मोटे तौर पर इस प्रकार है:

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 
} 

यहाँ क्या करने के लिए एक आसान पीएचपी समारोह है कि के लिए आप (निर्धारित):

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

उत्कृष्ट, जैसा कि अपेक्षित काम करता है। यह वास्तव में एक आसान PHP फ़ंक्शन है, मैं थोड़ी देर के लिए यह खोज रहा हूं। बहुत धन्यवाद! – user1309276

+0

@ user1309276 मैंने उपरोक्त फ़ंक्शन को अपडेट किया है, स्ट्रिंग में एक शाब्दिक CRLF होने पर व्यवहार के आसपास एक त्रुटि हुई थी। यह अब तय किया गया है, और इसने विकृत तारों का बेहतर पता लगाया है। – DaveRandom

+0

फिर से धन्यवाद! किसी भी व्यक्ति के लिए अभी भी समस्याएं हैं, unchunk_string को कॉल करने के बाद मुझे केवल 10 बाइट्स का उपयोग करने की आवश्यकता है: $ data = gzinflate (substr ($ data, 10)); – user1309276

0

को डिकोड करने के लिए एक स्ट्रिंग का उपयोग gzinflate, Zend_Http_Client lib में मदद मिलेगी सामान्य कार्यों के इस प्रकार करना है, इसकी wasy उपयोग करने के लिए, देखें Zend_Http_Response code यदि आप अपने स्वयं

+0

दुर्भाग्य से मैंने पहले से ही उस विधि का प्रयास किया है जो lib का उपयोग करता है, लेकिन इसमें भविष्य में कुछ कोड हो सकते हैं, धन्यवाद! – user1309276

संबंधित मुद्दे