【问题标题】:zlib 1.2.5 unable to recognize this headerzlib 1.2.5 无法识别此标头
【发布时间】:2013-01-21 07:37:32
【问题描述】:

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

未转义的数据有:

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

which inflate 抱怨标题无效。

当我自己使用 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/inflate*/inflateEnd 的内容。

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

【问题讨论】:

  • 请提供文本的完整版本以及所谓的嵌入式 deflate 流。
  • 添加相关文件发布。
  • 在出现前缀的情况下,在膨胀之前剥离 4 个前字节并没有帮助,尽管当我独立地对源进行放气时,字节 5-8 看起来非常接近有效的前 4 个字节(78 5E ED 7D)给自己发短信(78 9C ED 7D)。

标签: zlib


【解决方案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;
}

【讨论】:

  • 谢谢马克。但我有 78 5E(不是 9C)ED 7D 作为流开始后剥离小端 4 个字节(这是取消转义 '\\' '0' 后的前 5 个字节)。当我对原始源文本文件执行放气和充气时,我只会得到正确的 78 9C ED 7D 序列,而不会弄乱已经嵌入的版本。所以 zlib 仍然不喜欢 78 5E ...作为我的标题。我没看到什么?
  • 为什么说“zlib 还是不喜欢 78 5E”?你真的试过了吗?它工作正常,正如我所说:“我没有问题,并且完全解压缩了 codedreadbase.txt。”
  • 是的,我正在使用 inflateInit2 和 windowBits = 16+MAX_WBITS(错误的标头),并且还尝试了 windowBits = -MAX_WBITS(获取状态 HEAD、TYPEDO、STORED 并在那里失败,存储块长度无效)。我正在追求 -MAX_WBITS 选择,因为它至少可以通过标题,并重新检查我的转义等。
  • 没关系,我要么只需要使用 inflateInit,要么将 MAX_WBITS 传递给 inflateInit2,它就像一个魅力。谢谢先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多