“隐网项目”的图片下载模块需要与HTTP Response报文打交道,由于使用的是C++,没有java中十分好用的httpclient,所以打算自己实现。之前考虑的比较简单,假设请求的文件是jpeg文件,所以在收到数据之后,只考虑跳过响应报文的HEADER部分加\r\n\r\n四个字节后,直接把剩余的数据写到文件中。测试过程中,发现有相当一部分图片不能正常打开,总是比服务器多了几个字节;打印输出响应报文后发现头中并没有我们通常所见的Content-Length域来指明报文体的长度,反而是多了Transfer – Encoding域。上网查阅http1.1协议后,发现通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。协议中关于这个字段的具体解释如下:

一般HTTP通信时会使用是Content-Length头信息来指定body信息大小,但是有时候无法确定信息大小,就要使用trunked编码动态的提供body内容的长度。进行Chunked编码传输的HTTP数据要在消息头部设置:Transfer-Encoding: chunked表示Content Body将用chunked编码传输内容。Chunked编码一般使用若干个chunk串连而成,最后由一个标明长度为0的chunk标示结束。每个chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(非零开头的十六进制的数字)和数量单位(一般不写,表示字节).正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。

上述解释过于官方,简而言之,chunked编码的基本方法是将大块数据分解成多块小数据,每块都可以自指定长度,其具体格式如下:

其C语言的解码如下,java思路相同

int nBytes;

char* pStart = a; // a中存放待解码的数据

char* pTemp;

char strlength[10]; //一个chunk块的长度

chunk : pTemp =strstr(pStart,”\r\n”);

if(NULL==pTemp)

{

free(a);

a=NULL;

fclose(fp);

return -1;

}

length=pTemp-pStart;

COPY_STRING(strlength,pStart,length);

pStart=pTemp+2;

nBytes=Hex2Int(strlength); //得到一个块的长度,并转化为十进制

if(nBytes==0)//如果长度为0表明为最后一个chunk

{

free(a);

fclose(fp);

return 0;

}

fwrite(pStart,sizeof(char),nBytes,fp);//将nBytes长度的数据写入文件中

pStart=pStart+nBytes+2; //跳过一个块的数据以及数据之后两个字节的结束符

fflush(fp);

goto chunk; //goto到chunk继续处理

如何将一个十进制数转化为十六进制

char *buf = (char *)malloc(100);

char *d = buf;

int shift = 0;

unsigned long copy = 123445677;

while (copy) {

copy >>= 4;

shift++;

}//首先计算转化为十六进制后的位数

if (shift == 0)

shift++;

shift <<= 2; //将位数乘于4,如果有两位的话 shift为8

while (shift > 0) {

shift -= 4;

*(buf) = hex_chars[(123445677 >> shift) & 0x0F];

buf++;

}

*buf = ‘\0’;

java chunked编码解码_HTTP1.1中CHUNKED编码方式传输数据的解析相关推荐

  1. java chunked编码解码_HTTP协议中的CHUNKED编码解析

    HTTP协议中的TRANFER-ENCODING:CHUNKED编码解析 通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输.c ...

  2. c# java base64编码解码_C#教程之Base64编码解码原理及C#编程实例

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送.这样用途就受到了很大的 ...

  3. hm编码工具使用_HM中字典编码分析

    LZ77算法基本过程http://jpkc.zust.edu.cn/2007/dmt/course/MMT03_05_2.htm 输入待字典编码的CU, CopyCuFromPicYuv444(pcP ...

  4. mysql gbk编码 字节数,mysql中utf-8编码数据库转换成GBK编码的问题

    摘要 腾兴网为您分享:mysql中utf-8编码数据库转换成GBK编码的问题,之了课堂,易信,一折包邮,星球联盟等软件知识,以及七日杀,草莓软件,装修施工站,桔子会,桌面切换,看小说神器,酷派应用商店 ...

  5. python网络编程编码和解码_python编程中的编码和解码问题

    在编程中,对编码和解码感到困惑,经常会莫名其妙的出现一些问题,根据需要解决的问题,有以下几种情形: 1.在python2.7以下版本中,unicode和string的转换问题.对于一个变量v,是不是因 ...

  6. java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?

    在android的base64加密后得到: WwogIHsKICAgICJ0MSI6ICIwIiwKICAgICJ0MiI6ICIyNDM4NCIsCiAgICAidDMiOiAiIiwKICAgIC ...

  7. python声明编码作用_Python源代码中的编码声明字符串的作用

    原来以为Python编源代码头部的#encoding: utf8的字符串对于python的实际编码解析是没有影响的. 但是今天发现一个很好玩的问题.Mark一下. 当python的代码中存在类似u'中 ...

  8. python 编码声明位置,python中的编码声明

    python中的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python 相当于写死了 python 路径(是告诉OS执行这个py时,调 ...

  9. java线程工作内存在栈中吗_JVM常见面试题解析

    前言 总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新. 1.什么情况下会发生栈内存溢出. 思路: 描述栈定义,再描述为什么会溢出 ...

最新文章

  1. WinCE 5.0 virtual memory space
  2. swiper5 点击图换下一张_电商小牛教你如何选择点击率超同行三倍的爆品主图!...
  3. mysql 如何按时间备份_如何定时备份mysql数据库
  4. oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...
  5. WaterfallTree(瀑布树) 详细技术分析系列
  6. Win10+VS2017+Ceres-Solver-1.13.0配置
  7. 机器学习实战 2.3获取数据
  8. [RK3288][Android5.1] 调试笔记 --- LVDS+EDP双屏机器调节白平衡色温
  9. 会议直播全流程解决方案
  10. webstrom 2099年设置
  11. 你怎么看欧阳娜娜空降阿里p8?
  12. xp系统 自动锁定计算机,xp如何设置锁屏时间
  13. win7已经阻止此发行者在您的计算机上运行软件,Win7系统提示无法验证发布者windows已阻止软件的解决方法教程[多图]...
  14. eagle PCB软件使用心得
  15. linux 实验 ps,OS第1次实验报告:熟悉使用Linux命令和剖析ps命令
  16. 廖雪峰python教程学习之习题解析
  17. 国际认可度最高的验厂:BSCI
  18. 【加解密篇】Passware Encryption Analyzer快速检测加密文件软件
  19. 阿里云备案服务码怎么申请?
  20. Ubuntu 服务器安装远程 Rstudio(图文详解)

热门文章

  1. 如何实现中间大两头小的轮播效果
  2. 进行网络电视直播的几种方法
  3. 区块链开发之获取BTC,ETH的余额,BTC的UTXO列表,ETH的nonce
  4. spark 实现HDFS小文件合并
  5. 如何通过python画loss曲线 点线颜色及点线型设置说明(超实用)
  6. 【实验室乱记】基于 STM32 的采集 Adc 与 SD 卡储存
  7. 计算机适合女生考研的专业,计算机领域哪些专业适合女生?
  8. 如何解决Office365无法登录
  9. [模型学习]seq2seq
  10. 2021-2022半导体行业投资策略:矛盾与破局.pdf.