-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);
}
? –
* "特殊文字に遭遇したときにコードが問題になる" *何が問題なの? – user694733
ÿの通常の問題は、エンコーディングが255であることです。これは0xffであり、エンコーディングされたcharにEOFのように見えると-1に符号拡張されます。しかし、それはここの問題のようには見えません。しかし、http://c-faq.com/stdio/getcharc.htmlを参照してください。 –