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# 具有单独的 byte
和 char
类型的原因。
要确保您的字符串编码为 UTF8,您可以使用 Encoding class.
MSDN 有一个转换 to/from 编码的例子。
我正在实现一项功能,该功能需要在支持 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# 具有单独的 byte
和 char
类型的原因。
要确保您的字符串编码为 UTF8,您可以使用 Encoding class.
MSDN 有一个转换 to/from 编码的例子。