2016-04-22 23 views
-2

ファイルをbase64にエンコードし、読み取られた文字数を返す関数を作成する必要があります。 問題は、現在のコードがÿのような特殊文字に遭遇したときに問題に遭遇することです。それを修正する最も簡単な方法は何でしょうか?C言語のbase64エンコーディング特殊文字

static void encodeblock(unsigned char *in, unsigned char *out, int len) 
{ 
    out[0] = encoding[ (int)(in[0] >> 2) ]; 
    out[1] = encoding[ (int)(((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)) ]; 
    out[2] = (len > 1 ? encoding[ (int)(((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)) ] : '='); 
    out[3] = (len > 2 ? encoding[ (int)(in[2] & 0x3f) ] : '='); 
} 

int to_base64(const char *dst_file, const char *src_file) 
{ 
    unsigned char in[3]; 
     unsigned char out[4]; 
    int i, len, blocksout = 0; 
    int count = 0; 

    FILE *infile; 
    infile = fopen(src_file,"r"); 
    if(infile==NULL){ 
     return -1; 
    } 
    FILE *outfile; 
    outfile = fopen(dst_file,"w"); 
    if(outfile==NULL){ 
     return -1; 
    } 

     *in = 0; 
     *out = 0; 
    while(feof(infile) == 0) { 
     len = 0; 
     for(i = 0; i < 3; i++) { 
      in[i] = fgetc(infile); 


      if(feof(infile) == 0) { 
       len++; 
       count+=1; 
      } 
      else { 
       in[i] = 0; 
      } 
     } 
     if(len > 0) { 
      encodeblock(in, out, len); 
      for(i = 0; i < 4; i++) { 
       putc(out[i], outfile); 


      } 
      blocksout++; 
     } 
     if(blocksout >= (64/4) || feof(infile) != 0) { 
      if(blocksout > 0) { 
       fprintf(outfile, "\n"); 
      } 
      blocksout = 0; 
     } 
    } 
     fclose(infile); 
     fclose(outfile); 
    return(count); 
} 
+1

? –

+1

* "特殊文字に遭遇したときにコードが問題になる" *何が問題なの? – user694733

+0

ÿの通常の問題は、エンコーディングが255であることです。これは0xffであり、エンコーディングされたcharにEOFのように見えると-1に符号拡張されます。しかし、それはここの問題のようには見えません。しかし、http://c-faq.com/stdio/getcharc.htmlを参照してください。 –

答えて

0

「A」または「3」よりもその文字が任意のより特別なものは何バイナリ形式とアクセスでファイルを開く