chunked编码格式的解码程序

chunked 编码是把一段文本分解为多个小块,分别是由块大小和块数据组成。块大小是一个十六进制的数据加上回车换行符结束,块数据最后也是由回车和换行符结束。

具体数据的格式是:十六进制的块大小+回车+换行+数据块+回车+换行

最后一个是块大小为零表示结束了。最后的结尾一般是:0\r\n\r\n

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 int NumberToDecimal(const char* number,int base)  //十六进制转为十进制.程序未加入防错处理。
 6 {
 7     int Decimal=0;
 8     int Length=0;
 9     int Exponent=0;
10     int power=0;
11     Length=strlen(number);
12     power=Length;
13     int i;
14     for(i=0;i<Length;i++){
15         int atom=0;
16         if(number[i]>='0'&&number[i]<='9')
17             atom=number[i]-'0';
18         else if(number[i]>='A'&&number[i]<='F')
19             atom=number[i]-'A'+10;
20         else if(number[i]>='a'&&number[i]<='f')
21             atom=number[i]-'a'+10;
22         else 
23             break;
24         Decimal=Decimal+atom*pow(base,power-i-1);
25     }
26     printf("source number is:%s\t Decimal is :%d\n",number,Decimal);
27     return Decimal;
28 }
 1 ///////////////////////////////////////
 2 //
 3 //解码chunked
 4 //
 5 //
 6 ////////////////////////////////////////
 7 
 8 bool decode_chunked(const char* FileNameFrom,const char* FileNameTo)
 9 {
10     FILE *fpIn=NULL,*fpOut=NULL;
11     
12     //打开输入和输出文件
13     fpIn=fopen(FileNameFrom,"r");
14     if(NULL==fpIn)
15         return false;
16     fpOut=fopen(FileNameTo,"w");
17     if(NULL==fpOut)
18         return false;    
19     //fseek(fpIn,0L,SEEK_END);
20     while(true){
21     char szLength[10]={0};
22     int i;
23     for(i=0;i<10;i++){
24         szLength[i]=fgetc(fpIn);
25         if(szLength[i]=='\n')
26             if(szLength[i-1]=='\r')
27                 break;
28     }    
29     szLength[i-1]=0;
30     puts(szLength);
31     int size=NumberToDecimal(szLength,16);    
32     if(size==0)
33         break;
34     char* pBuffer=NULL;
35     pBuffer=(char*)malloc(size);
36     if(pBuffer==NULL)
37         break;
38     memset(pBuffer,0,size);
39     fread(pBuffer,size,1,fpIn);
40     fwrite(pBuffer,size,1,fpOut);
41     free(pBuffer);
42     fgetc(fpIn);
43     fgetc(fpIn);
44     }
45     //关闭输入和输出文件
46     fclose(fpIn);
47     fclose(fpOut);
48     return true;
49 }

 

posted @ 2016-02-06 17:48  夜梦多离殇  阅读(655)  评论(0编辑  收藏  举报