19,469
社区成员
发帖
与我相关
我的任务
分享
函数介绍:
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;
}
#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;
}