数据流字符串部分缺失问题以及uncompress解压缩数据流从哪里开始

在尝试解压缩报文数据时,发现了之前对报文归纳整理成数据流输出txt时的一个疏忽点。
问题:输出压缩数据时出现输出数据部分缺失的情况,导致输出的报文压缩数据不完整 函数:memcpy
出现原因:在压缩报文的数据中,含有’\0’字符,而使用字符串连接时,我直接用了函数strcpy,这个函数的性质即遇字符’\0’即终止不再处理后面的字符,故出现连接的几段字符串都出现丢失后部分的内容,使得拼接起来的字符串不完整。
解决方法:使用函数memcpy(char *des,char *src,int len)(len是指定复制字符长度),值得注意的是,这个函数不仅仅可以复制,还可以达到拼接字符串的作用。
例:

char s[8]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’\0’,’\,’};
char t[7]={‘m’,’y’,’ ’};
char m[6]={‘n’,’a’,’m’,’e’}
char ss[50];
memcpy(ss,s,8);
memcpy(ss+8,t,3);
memset(ss+8+3,m,4);
For(int i=0;i<8+3+4;i++){
Printf(“%c”,ss[i]);

输出结果:hello \0,my name

问题:关于从http应答报文中提取的报文包含压缩数据如何先处理获得的报文数据提取出uncompress所能解析的字符串?
关于解压缩http报文,网上大多数的讲解都是关于函数inflate..函数之类的使用,甚至有些说法是gzip类压缩只能通过inflate类函数解压,(废话:好吧,主要是以为没看懂上面的解压函数的用法,而且对于初学者来说,单纯的函数放在那对于我来说甚至连函数输入的部分都不明确,不清楚从报文的什么时候开始输入就完全得不到任何可见数据,故放弃了那类函数,从而选择compress与uncompress),这个函数应该相比而言简单多了,但还是要摸索函数中要求输入的字符串是什么。
探索方法:先输入几个小段字符串,对字符串进行压缩,观察压缩后的数据的字符十六进制的格式,发现每个字符串压缩后前两个字符的十六进制都为 78 9f,然后比较http报文中的压缩数据部分,从content-Ecoding:gzip后同时带有相同格式的字符串十六进制形如:0d 0a (XX XX XX … ,压缩数据的长度<每个字符对应其ascii值得十六进制值,换算过后是数据长度的十六进制>)0d 0a 1f 8b 08 00 00 00 00 00 00 03 (压缩的数据内容部分)0d 0a 30 0d 0a 0d 0a

数据处理:对于获取的http报文整合的一条压缩数据报文,首先从content-ecoding:gzip开始提取到数据尾,然后把压缩长度单独提取出来,在把数据从03后面开始截取到尾赋给字符串S,随后在把插入两个字节78 9f在S头,所得到的数据即为uncompress要求输入的数据,
例:

char output[N*5];
char inpute[N];
ulong nn=N*5;
Int length=(已知);
uncompress(output,&nn,input,length);
//注:当nn的取值过小时会出现解压的数据只解压了前面一部分的情况。
Unsigned long nn=200;
    char test[]="iaaaaaccccContent-Encoding: gzip";
    char ss[]="Csdfjlaskjhdfusfsklgontent-Encoding: gzip";
    char stt[200];
    char *as=calloc(1,200);
    char str[N*10],stt1[200];
as=stt;
    a=out;
    k=0;
    compress(as,&nn,test,strlen(test)+1);
    for(; k<strlen(stt); k++)
    {
        printf("%.2x ",(unsigned char)as[k]);
    }
    printf("\n%s\n",stt);
    k=0;
    memset(stt,0,sizeof(stt));
    as=stt;
    compress(as,&nn,ss,strlen(ss)+1);
    for(; k<strlen(stt); k++)
    {
        printf("%.2x ",as[k]);
    }
    printf("\n%s\n",stt);
    k=0;
    for(; k<strlen(out); k++)
    {
        if(k%16==0)
        {
            printf("\n");
        }
        printf("%.2x ",(unsigned char)*(a+k));
    }
    uncompress(stt1,&nn,stt,strlen(stt));
    printf("\n\n%s\n",stt1);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值