0

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)后用确切的字节数复制 Byte compr[256] 中的 256

如果有人纠正我会很棒
谢谢

4

1 回答 1

2

这一行是错误的:

Len = i - 1;

因为当 i 为 5 时,您会执行 Len = i - 1; 所以 len 将是 4,但你想压缩 5 个字节。只需使用:

Len = i;

另一个问题 comprLen 从未被赋值。在 Compress(Byte Compressed[], uLong CompressedLength..) 中,不使用 itCompressedLength。我假设你想要它的价值回来。你应该这样定义:

Compress(Byte Compressed[], uLong& CompressedLength..)

并将行更改为使用 CompressedLength 而不是使用长度:

zReturnCode = compress2(Compressed, &CompressedLength, (const Bytef*)YourByte, Len,CompressionLevel);
于 2013-05-09T21:30:35.983 回答