0

我在另一个文本文件中有一个源文本及其所谓的 zlib 压缩嵌入(和 \ 转义)。除了使用 zlib 对 \0、\t、\n、\r、引用等进行标称转义外,我没有关于其编码的文档。

未转义的数据有:

前四个字节:1A 9B 02 00 最后四个字节:76 18 23 82

哪个 inflate 抱怨标题无效。

当我自己使用 1.2.5 对匹配的源文本进行放气/膨胀时,我得到:

前四个字节:78 9C ED 7D

有人可以建议在给定标头字节的情况下使用什么压缩吗?我还没有找到任何实际使用它们的幻数或标题公式。

编辑:是相关文件...

  • codedreadbase.cohdemo 是源文本文件,在 BASE 动词后面带有转义的嵌入部分。逃脱是:

    \n = (换行) \r = (返回) \0 = 0 (NULL) \t = tab \q = " \s = ' \d = $ \p = %

  • codedreadbase.deflated 是我在双引号中取消上述内容后传递给 zlib inflateInit/inflate*/inflateEnd 的内容。

  • codedreadbase.txt 是嵌入部分的原始文本。
4

1 回答 1

1

您的前四个字节1A 9B 02 00是未压缩数据的长度,以小端顺序排列,十进制为 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;
}
于 2013-01-20T17:11:10.993 回答