C ++ zlib膨胀失败 - c#fixup的翻译?

时间:2010-12-14 17:04:59

标签: c# c++ translation zlib deflate

我正在尝试使用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。

万分感谢 悦

2 个答案:

答案 0 :(得分:1)

对于zlib互操作,使用SharpZipLib比使用本机.Net Framework类更好。这正确地处理来自C ++(zlib native)和Java压缩类的流,而不需要任何有趣的业务。

答案 1 :(得分: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) {

如果您处于严格模式,read up to 4092 bytes - 或非严格模式下的1 - 进入字节缓冲区

        outp.Write(b, 0, n);

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

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

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

我有点困惑:为什么不在b个元素处删除数组n并返回而不是通过MemoryStream?代码也应该注意清理内存流和zip异常(例如使用using),因为它们都是IDisposable但是我认为这并不重要因为它们不对应于I / O文件句柄,只对应于内存结构。