首页 > 编程知识 正文

gzip文件怎么解压命令,c语言将数据写入文件

时间:2023-05-03 22:47:34 阅读:17493 作者:730

这是一本账簿,记录了两天前用http解压缩gzip数据的过程。 (写了这个就可以做其他的工作了~~) ) 目的用c语言解压缩http的中gzip文件 一. tcpdump抓住包。 这个包是我尝试某个APP时收到的包。 让我们先用wireshark分析一下。 用图的标签说明的话: 1 .内容编码: gziprn指示包是gzip; 2 .由于okhttp/并不发出本机http请求,因此他在header中没有真正的用户代理,而是包含类似“okhttp/版本号”的字符串。 因为在后台需要统计信息,所以要求传递给正确的用户代理。 (我在这个网上复印了) 3.gzip分组有1376字节 4.gzip压缩数据。 可以看到分组的前6个字节1f8b08,其中1f0b表示gzip格式,08代码deflate算法 5 .因为有gzip标记,wireshark自动解压缩了gzip数据。 用printf打印时乱码,必须解压缩 6 .同上5; 7 .这里的字段是我们最终要找的字段,我打了号码。 这是这个APP的账户; 8.gzip有1376字节,解压缩后的大小为4093字节。 二、c语言找出gzip数据包的起始位置 1 .在http字段中找到" Content-Encoding: gzip ",您可以在此确定http数据是否由gzip压缩。 rnrn结尾表示http消息已结束。 gzip是压缩数据,紧接在http结束标志之后。 () )。 2 .紧接其后的ascll代码序列是gzip包的大小xxxxx

xrn,这里的rn是gzip长度的结尾;

3 .下一位置是gzip分组的开头位置

那么,到现在为止,已经找到了gzip开始位置和gzip数据包长度。 全都说哦~

粘贴将ascll代码转换为十进制intchrtodec(charchr ) {int value=0的功能函数; //首先将所有小写字母转换为大写if () chr='z ' ) (chr='z ' ) ) chr=chr-32; //将字符转换为适当的数字if () chr='9' ) () chr='9' ) ) value=chr-48; ELSEif () chr='Z ' ) chr='Z ' ) ) value=chr-65 10; 返回值; (三、gzip解冻

1 .方式一、将gzip数据写入文件,在命令行解压缩此文件,虽说可以成功,但由于是笨拙的讨价还价,所以不推荐。

2 .方式2、调用zlib库,解压缩到内存中。 这段代码不是我写的,是从一个网友那里复制过来的。 很容易使用。 (有关详细信息,请参阅本文末尾的几个链接。)

/* Gzip uncompress*//*注意: gzip和zip解压缩差不多,但是他们头部的数据大小不同,必须注意。 inflateinit2(d_stream,47 (*/intvidpeek _ uncompress GS unsigned int srcsize,char**pOutDest,unsigned int * pout bufff char*pbuf=psrc(srcsize-1 ); unsigned int len=*pBuf; int uncompressResult; z_stream d_stream; int i=0; printf (# # # # # # # # # psrc0x % x0x % x0x % x ',pSrc[0],pSrc[1],pSrc[2],pSrc[3]; //check gz file,RFC1952p6if () psrc!=0x1f(|(* ) psrc1 )!=0x8b ) (printf ((nuncompressgzipnongzip (n ) ); 返回错误; (for ) I=0; i 3; I ) ) pbuf----; len=8; len =*pBuf; //fortestif((len==0)len1000000 ) ) printf ) (nuncompressgzip,error gzip! n '; 返回错误; }//gzip描述启动! d_stream.zalloc=Z_NULL; d_stream.zfree=Z_NULL; d_stream.opaque=Z_NULL; d_stream.next_in=Z_NULL; d_stream.avail_in=0; uncompress result=inflate init2(d _ stream,47 ); 未完成结果!=Z_OK () printf ((ninflateinit 2错误: % d (n ),uncompressResult ); 返回未完成结果; } d_stream.next_in=pSrc; d_stream.avail_in=srcSize; d_stream.next_out=(char * ) *pOutDest; d_stream.avail_out=len; uncompress result=inflate (d _ stream,Z_NO_FLUSH ); 交换机(uncompress result ) casez _ need _ dict : uncompress result=z _ data _ error; casez _ data _ error : casez _ mem _ error 3360 (void ) inflateend(d_stream ); 返回未完成结果; (/printf )、outlen=%d、total_in=%d、total _ out=% d @ @ @ @ @ @ @ (n )、avail _ out=% d *pOutBufSize=len-2; 返回ret; (四、解析解冻成功的数据

根据成功解压缩的数据,找到目标字段,例如' p': '。 请注意,在c语言的双引号前加上“”。

结果:成功找到gzip的app帐户字段!

参考链接

3359 blog.csdn.net/fcryuuhou/article/details/12951279

https://blog.csdn.net/犹豫不决的旅行者/article/details/7728520

http://www.openedv.com/forum.php? mod=viewthreadtid=231109

是的,逃跑了~~~

有缘看到的盆友,期待您的意见。

谢谢你! 大家一起技术进步哦~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。