1

我正在尝试使用 zlib 的 deflate 为字符串充气,但它失败了,显然是因为它没有正确的标题。我在其他地方读到这个问题的 C# 解决方案是:

public static byte[] FlateDecode(byte[] inp, bool strict) {
    MemoryStream stream = new MemoryStream(inp);
    InflaterInputStream zip = new InflaterInputStream(stream);
    MemoryStream outp = new MemoryStream();
    byte[] b = new byte[strict ? 4092 : 1];
    try {
        int n;
        while ((n = zip.Read(b, 0, b.Length)) > 0) {
            outp.Write(b, 0, n);
        }
        zip.Close();
        outp.Close();
        return outp.ToArray();
    }
    catch {
        if (strict)
            return null;
        return outp.ToArray();
    }
}

但我对C#一无所知。我可以推测它所做的只是为字符串添加一个前缀,但那个前缀是什么,我不知道。有人可以用 C++ 来表述这个函数(甚至只是头文件创建和字符串连接)吗?

我试图膨胀的数据是从使用 zlib 通缩的 PDF 中获取的。

谢谢一百万,怀亚特

4

2 回答 2

1

使用SharpZipLib进行zlib互操作比使用原生 .Net Framework 类更幸运。这可以正确处理来自 C++(zlib本机)和 Java 压缩类的流,而无需任何有趣的业务。

于 2010-12-14T17:09:31.087 回答
0

我看不到任何前缀,抱歉。这就是逻辑似乎是什么;抱歉,这不在 C++ 中:

MemoryStream stream = new MemoryStream(inp);
InflaterInputStream zip = new InflaterInputStream(stream);

从传递的数据创建一个膨胀流

MemoryStream outp = new MemoryStream();

为输出创建内存缓冲流

byte[] b = new byte[strict ? 4092 : 1];
try {
    int n;
    while ((n = zip.Read(b, 0, b.Length)) > 0) {

如果您处于严格模式,则最多将 4092 个字节(或非严格模式下的 1 个字节)读入字节缓冲区

        outp.Write(b, 0, n);

将所有解码的字节(可能小于4092)写入输出内存缓冲流

    zip.Close();
    outp.Close();
    return outp.ToArray();

清理,并将输出内存缓冲区流作为数组返回。

不过,我有点困惑:为什么不直接bn元素处切断数组并返回它而不是通过 a MemoryStream?代码还应该真正注意清理内存流和zip异常(例如使用using),因为它们都是IDisposable但我想这并不重要,因为它们不对应于 I/O 文件句柄,仅对应于内存结构。

于 2010-12-14T17:19:31.037 回答