100分!使用ZLIB压缩库内函数uncompress的问题?
压缩: BYTE bt[1024];
unsigned long arrary=sizeof(SendType),dfilewrite=sizeof(bt);
memset(bt,0,1024);
memset(&sendID,0,arrary);
memcpy(sendID.SendData,&bmpblock,sizeof(ScreenNewBlock));
compress(bt,&dfilewrite,(Bytef*)&sendID,arrary);
memcpy(prodata->prdata,bt,1024);
send(....)
使用uncompress函数解压缩后数据丢失,总共发送原数据5000字节,解压后仅剩1121字节期于字节为空了
发送前的压缩数据与接收后的压缩数据相同,就在解压后 数据丢失了,忘高人指点
BYTE bt[1024*11];
memset(bt,0,1024*11);
unsigned long uncomdatalen=sizeof(bt);
uncompress(bt,&uncomdatalen,prorecvdata->prdata,1024);
[解决办法]
在调用compress时,需要提供一个缓冲区用于接收压缩后的数据,这个缓冲区应该比要压缩的数据长一些,因为有些数据是不可压缩的,压缩后比原数据还长。
compress的第2参数是一个变量地址,该变量在调用时指定输出缓冲区的大小,在返回后记录实际压缩后的数据长度,不同数据压缩后的长度是不同的。你需要把每次压缩后的数据和长度保存起来,在调用uncompress的时候给出数据和长度,compress与uncompress要一一对应。
[解决办法]
压缩: BYTE bt[1024];
unsigned long arrary=sizeof(SendType),dfilewrite=sizeof(bt);
memset(bt,0,1024);
memset(&sendID,0,arrary);
memcpy(sendID.SendData,&bmpblock,sizeof(ScreenNewBlock));
compress(bt,&dfilewrite,(Bytef*)&sendID,arrary);
memcpy(prodata->prdata,bt,1024);
send(....)
不太明白你的memcpy(prodata->prdata,bt,1024);
你要保证:
sizeof(bt)的大小必须能容纳压缩后的大小,你上面是固定了1024
dfilewrite同样的道路。
你可以测试下compress的返回值
返回Z_MEM_ERROR是系统内存不足
返回Z_BUF_ERROR是你的bt缓冲区太小
返回Z_OK才代表成功了压缩。
memcpy(prodata->prdata,bt,dfilewrite); //dfilewrite这是实际压缩后的字节数