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 }