zlib inflate() 仅解码原始有效负载的一半

zlib inflate() decodes only half the original payload

我正在实现一项功能,该功能需要在支持 C#/.NET 的 Windows CE 平台上使用 zlib compression/decompression。这是一个旧系统,我正在努力让 zlib deflate()/inflate() 工作。我从 zlib 版本 1.2.3(已经构建和链接)开始,但我也将它更新到版本 1.2.11。两个版本都存在相同的问题。

C# 托管代码 pInvokes

zlib.compress (cBuf, cBufSize, "This is the content.", 20)

它returns

cBufSize = 15 
cBuf = {0x0b, 0x61, 0xc8, 0x60, 0xc8, 0x64, 0x28, 0x66, 0x50, 0x80, 0x92, 0x25, 0x40, 0x3e, 0x00}

我的 C# 托管代码然后 pInvokes

zlib.uncompress(tBuf, tBufSize, cBuf, 15)

它returns

tBufSize = 20
tBuf = {'T','h','i','s',' ','i','s',' ','t','h',0,0,0,0,0,0,0,0,0,0}

由于某种原因,只有一半的原始字节流被压缩(或解压缩)。对于我为改变原始数据流所做的所有尝试都是如此。 tBuf 的后半部分始终为零!

因为我对 zlib 的工作原理一无所知,所以我没有尝试调试它。我希望有人知道这个非常古老的 Windows CE 平台上的 zlib 配置可能有什么问题。

cbuf中的压缩数据是完整且正确的原始压缩数据。它解压缩为(十六进制):

54 00 68 00 69 00 73 00 20 00 69 00 73 00 20 00 74 00 68 00

您看到的是每个字符之间的零字节。你实际上得到了 20 个字节。问题是您提供给 zlib 进行压缩的 20 个字节只是字符串的前十个 字符 ,显然每个字符编码为两个字节。

我不太了解 C# 或 Windows 系统,但我猜你的字符串由于某种原因被存储为 UTF-16。

这是对 Mark Adler 回答的补充。他是绝对正确的。 C# 和 Windows(如果我没记错的话)将字符串存储在 16 位字符值中,这就是 C# 具有单独的 bytechar 类型的原因。

要确保您的字符串编码为 UTF8,您可以使用 Encoding class.

MSDN 有一个转换 to/from 编码的例子。