【新手送分题】uncompress返回Z_DATA_ERROR怎么办 20+70分

zhangch4021 2010-05-25 08:02:33

在用uncompress函数时候,总是返回Z_DATA_ERROR
有可能是参数传的不正确,确实第三第四个参数我不知道用哪个。大家帮我看看怎么回事好吗
本帖设20分
还有一个帖子无人领分,您要是能帮我解决了,那70分也给您了


函数介绍:
int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。




/////////////////////////////////我是华丽的风格线/////////////////////////////////////////



void ::GetDesktopBit(HWND hWnd)
{

DWORD bitsize;
char *buf;
buf=new char[US_MAXSIZE];//a mass of China charachater
int len;
int Flag;
DWORD destLen;
HDC hdc;
HANDLE hDib;

RECT rect;
BYTE *p,*p2;

Flag = US_DIBFLAG;

recv(c_SCRsock,(char*)&destLen,sizeof(destLen)+1,0);//bit size==380008
send(c_SCRsock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);
recv(c_SCRsock,(char*)&bitsize,sizeof(bitsize),0);
send(c_SCRsock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);


hDib = GlobalAlloc(GMEM_MOVEABLE,destLen);
// BYTE* pbyBmp = (BYTE *)::GlobalLock(hDib);

p = (LPBYTE)GlobalLock(hDib);
p2 = p;


//分段从SERVER获取数据
for(WORD i=0;i<destLen/US_MAXSIZE;i++)
{
len = recv(c_SCRsock,buf,US_MAXSIZE,0);
CopyMemory(p2,buf,US_MAXSIZE);
p2 = p2 + US_MAXSIZE;
send(c_SCRsock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);
}
if (destLen%US_MAXSIZE)
{
len = recv(c_SCRsock,buf,destLen%US_MAXSIZE,0);
CopyMemory(p2,buf,len);
p2 = p2 + destLen%US_MAXSIZE;
send(c_SCRsock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);
}
p2 = p2 - destLen;
BYTE* pbyBmp=(BYTE *)::GlobalLock(p2);

//解压缩

uLong uncomprLen=destLen*3;
BYTE* uncompr=(BYTE*)calloc((uInt)uncomprLen , 1);
int err = uncompress(uncompr, &uncomprLen, pbyBmp ,destLen );
if(err==Z_OK)
{

CString str;
str.Format("½âѹËõ³É¹¦£¡%dKB/%dKB",uncomprLen/1024,destLen/1024);
AfxMessageBox(str);
}
else
{
//CString str;
//str.Format("½âѹËõʧ°Ü%d",err);
//AfxMessageBox(str);
}

hdc = GetDC(hWnd);

GetClientRect(hWnd,&rect);

int color = (1<<((LPBITMAPINFOHEADER)p2)->biBitCount);//access violation
if(color>256)
color = 0;

StretchDIBits(hdc, 0, 0, rect.right,rect.bottom,0,0,
((LPBITMAPINFOHEADER)p)->biWidth,
((LPBITMAPINFOHEADER)p)->biHeight,
(LPBYTE)p+(sizeof(BITMAPINFOHEADER)+color*sizeof(RGBQUAD)),
(LPBITMAPINFO)p,DIB_RGB_COLORS, SRCCOPY);


GlobalFree(hDib);
ReleaseDC(hWnd,hdc);
delete buf;
}

...全文
862 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
winyin 2010-12-12
  • 打赏
  • 举报
回复
send recv 加了MSG_OOB 参数时只有一个字节是紧急类型的,其它字节都发到正常数据流了
fei4630365 2010-09-26
  • 打赏
  • 举报
回复
我的也是这种情况,我是用compress压缩的之后写成一个文件,然后在另外一个程序中读取存储压缩后的这个文件去掉头部,用uncompress解压,结果就是这个问题!
zhangch4021 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiuxianshen 的回复:]

直接用p看看
[/Quote]
还是不行……
xiuxianshen 2010-05-25
  • 打赏
  • 举报
回复
直接用p看看
zhangch4021 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiuxianshen 的回复:]

感觉还是源数据buffer没有找对的问题,你的pbyBmp长度明显不是destLen
[/Quote]

我想出来程序的意思了
p2开始是首地址,接收一个数据包加US_MAXSIZE这么长,收destLen/US_MAXSIZE次之后正好是destLen的长度
那应该用p2就行啊
为什么还是返回错误呢?……
xiuxianshen 2010-05-25
  • 打赏
  • 举报
回复
感觉还是源数据buffer没有找对的问题,你的pbyBmp长度明显不是destLen
zhangch4021 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 schlafenhamster 的回复:]

Z_DATA_ERROR好像压缩和解压缩不是配套程序,(zlib,gzip ??)
[/Quote]
是吗?
可是例程里也是这么配对用的啊
#i nclude <stdio.h>
#i nclude "zlib.h"

int main()
{
//原始数据
const unsigned char strSrc[]="hello world!\n\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd中文测试 中文测试\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd中文测试 中文测试\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd中文测试 中文测试\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd中文测试 中文测试";

unsigned char buf[1024]={0},strDst[1024]={0};
unsigned long srcLen=sizeof(strSrc),bufLen=sizeof(buf),dstLen=sizeof(strDst);

printf("Src string:%s\nLength:%d\n",strSrc,srcLen);
//压缩
compress(buf,&bufLen,strSrc,srcLen);
printf("\nAfter Compressed Length:%d\n",bufLen);
printf("Compressed String:%s\n",buf);
//解压缩
uncompress(strDst,&dstLen,buf,bufLen);
printf("\nAfter UnCompressed Length:%d\n",dstLen);
printf("UnCompressed String:%s\n",strDst);
return 0;
}

schlafenhamster 2010-05-25
  • 打赏
  • 举报
回复
Z_DATA_ERROR好像压缩和解压缩不是配套程序,(zlib,gzip ??)
zhangch4021 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiuxianshen 的回复:]

pbyBmp 的长度是destLen 么?
[/Quote]

接收到的那个压缩图像是destLen

就是不知道图像的 const Bytef *source是哪个变量
xiuxianshen 2010-05-25
  • 打赏
  • 举报
回复
pbyBmp 的长度是destLen 么?
zhangch4021 2010-05-25
  • 打赏
  • 举报
回复
函数介绍:
int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧