在C++ zLib compress byte array解决我的第一个问题后,我遇到了另一个问题
void CGGCBotDlg::OnBnClickedButtonCompress()
{
// TODO: Add your control notification handler code here
z_const char hello[256];
hello[0] = 0x0A;
hello[1] = 0x0A;
hello[2] = 0x0A;
hello[3] = 0x0A;
hello[4] = 0x0A;
hello[5] = PKT_END;
hello[6] = PKT_END;
hello[7] = PKT_END;
Byte compr[256];
uLong comprLen = sizeof(compr);
int ReturnCode;
ReturnCode = Compress(compr, comprLen, hello, Z_DEFAULT_COMPRESSION);
g_CS.Send(&compr,comprLen);
}
int CGGCBotDlg::Compress(Byte Compressed[], uLong CompressedLength, CHAR YourByte[], int CompressionLevel)
{
int zReturnCode;
int Len;
for (int i = 0 ; i <= 10240 ; i++)
{
if (YourByte[i] == PKT_END && YourByte[i+1] == PKT_END && YourByte[i+2] == PKT_END)
{
Len = i - 1;
break;
}
}
uLong Length = (uLong)(sizeof(YourByte) * 1.0001) + 12;
zReturnCode = compress2(Compressed, &Length, (const Bytef*)YourByte, Len,CompressionLevel);
return zReturnCode;
}
我试图压缩hello []实际上是5个字节(我想压缩前5个字节)
压缩后的预期结果为: 0x78,0x9C,0xE3,0xE2,0x02,0x02,0x06,0x00,0x00,0xCE,0x00,0x33
但压缩后得到的只是预期结果的前4个字节,而另一个字节只是其他字节。
我的第二个问题是我希望在解压缩原始缓冲区(在我的情况下为12)后用字节compr [256]中的256个字节重复执行
如果有人纠正我会很棒 感谢
答案 0 :(得分:1)
这条线错了:
Len = i - 1;
因为当我5岁时,你会做Len = i - 1;所以len将是4,但你想压缩5个字节。只需使用:
Len = i;
另一个问题comprLen从未被赋值。在Compress(Byte Compressed [],uLong CompressedLength ..)中,不使用itCompressedLength。我假设你想要它的价值。你应该这样定义:
Compress(Byte Compressed[], uLong& CompressedLength..)
并更改该行以使用CompressedLength而不是使用length:
zReturnCode = compress2(Compressed, &CompressedLength, (const Bytef*)YourByte, Len,CompressionLevel);