2013-01-20 50 views
0

我有一個源文本和它的被稱爲zlib的縮小嵌入(和\轉義)在另一個文本文件。我沒有文檔在其編碼其它比它使用的zlib標稱轉義\ 0 \噸,\ N,\ R,報價等zlib 1.2.5無法識別這個頭文件

的未轉義數據具有:

前四個字節: 1A 9B 02 00 最後四個字節:76 18 23 82

哪個充氣抱怨有一個無效的標題。

當我放氣/誇大自己使用1.2.5匹配的源文本,我得到:

前四個字節:78 9C ED 7D

有人建議可以什麼壓縮正在使用給定的頭字節?我還沒有找到任何實際使用這些數字的幻數或標題公式。

編輯:Here是相關文件...

  • codedreadbase.cohdemo是繼BASE動詞轉義嵌入部分的源文本文件。逃逸是:

    \ N =(換行) \ R =(返回) \ 0 = 0(NULL) \ T =標籤 \ Q =「 \ S =' \ d = $ \ p =%

  • codedreadbase.deflated就是我傳遞爲zlib inflateInit /膨脹*/inflateEnd上述unescpaing雙引號內之後。

  • codedreadbase.txt是嵌入式部分的原文。
+0

請提供與所謂的嵌入式deflate流的文本的完整版本。 –

+0

添加要發佈的相關文件。 – redgiant

+0

儘管字節5-8看起來非常接近(78 5E ED 7D)到有效的前4個字節,但我自己獨立縮減了源文本(78 9C ED 7D) )。 – redgiant

回答

1

您的前四個字節0​​是按小端順序排列的未壓縮數據的長度,十進制爲170778。你確實已經找到了一個有效的zlib流的開始和接下來的四個字節:78 5E ED 7D。您只需要從轉義格式中正確提取二進制壓縮流。我沒有問題,並完全解壓縮codedreadbase.txt。

你沒有提到一個明顯的轉義,這是反斜槓本身。 \\應該去\。也許這就是你想要的。 C中的這個簡單的無法逃脫的工作:

#include <stdio.h> 

int main(void) 
{ 
    int ch; 

    while ((ch = getchar()) != EOF) { 
     if (ch == '\\') { 
      ch = getchar(); 
      if (ch == EOF) 
       break; 
      ch = 
       ch == 'n' ? '\n' : 
       ch == 'r' ? '\r' : 
       ch == '0' ? 0 : 
       ch == 't' ? '\t' : 
       ch == 'q' ? '"' : 
       ch == 's' ? '\'' : 
       ch == 'd' ? '$' : 
       ch == 'p' ? '%' : ch; 
     } 
     putchar(ch); 
    } 
    return 0; 
} 
+0

謝謝馬克。但是在剝離小端4個字節(這是在'\''0'之後的前5個字節)剝離後,我有78個5E(不是9C)ED 7D作爲流開始。當我執行deflate並在原始源文本文件上膨脹時,我只得到正確的78 9C ED 7D序列,而不會干擾已經嵌入的版本。所以zlib仍然不喜歡78 5E ......作爲我的標題。我沒有看到什麼? – redgiant

+1

你爲什麼說「zlib仍然不喜歡78 5E」?你真的嘗試過嗎?它工作正常,正如我所說:「我沒有問題,並正確解壓codedreadbase.txt。」 –

+0

是的,我正在使用inflateInit2與windowBits = 16 + MAX_WBITS(錯誤的標題),並試圖與windowBits = -MAX_WBITS(獲取狀態頭,TYPEDO,存儲和失敗的存儲塊長度無效)。我正在追求-MAX_WBITS的選擇,因爲它至少會超過標題,並重新檢查我的無用信息等等。 – redgiant