嗨,我做了一个base 64编码器,其中一些可以使用,但不能100%使用,这让我发狂,为什么它不起作用。

int b64_encode(FILE *in, FILE *out)
{
do
{
char outbuf [76+3];// room for null \n \r
char inbuf [57];//ratio 4ascii/3chars
for(int i=0; i < sizeof(inbuf);i++)
    inbuf[i]=0;
int i1;
int i2;
int i3;
int o1;
int o2;
int o3;
int o4;
int combine;
size_t read_cnt;
read_cnt = fread(inbuf,1,sizeof(inbuf),in);
for (int i = 0; i < read_cnt; i=i+3)
{
    i3 = inbuf[i+2];
    i2 =inbuf[i+1] << 8;
    i1 = inbuf[i] << 16;
    combine = i1+i2+i3;
    o4 = (combine & 0x3f);
    combine = combine >> 6;
    o3 = (combine & 0x3f);
    combine = combine >> 6;
    o2 = (combine & 0x3f);
    combine = combine >> 6;
    o1 = (combine & 0x3f);
    combine = combine >> 6;
    outbuf[i*4/3]=ENCODE[o1];
    outbuf[i*4/3+1]=ENCODE[o2];
    outbuf[i*4/3+2]=ENCODE[o3];
    outbuf[i*4/3+3]=ENCODE[o4];
}
for(int i=0; i < sizeof(outbuf);i++)
{
    if(outbuf[i]==0)
    {
        outbuf[i+2]='\0';
        outbuf[i]='\r';
        outbuf[i+1]='\n';
        i=sizeof(outbuf);
    }
}
//padding
if((read_cnt%3)==2)
{
    int t= (int)read_cnt;
    int temp= ((t/3)+1)*4;
    outbuf[temp-1] = '=';
}
if((read_cnt%3)==1)
{
    int t= (int)read_cnt;
    int temp= ((t/3)+1)*4;
    outbuf[temp-1] = '=';
    outbuf[temp-2] = '=';
}

//for(int i=0; i < sizeof((read_cnt)*4/3);i++)
printf("%s",outbuf);


}
while(feof(in)==0);





return 0;
}


当我键入示例时,我在Wikipedia上获得了“人是杰出的,不仅是因为他的原因,还因为来自
坚忍不拔的其他动物,这是一种心灵的欲望
在持续不断的知识创造中,超越了短期
任何肉体上的愉悦感。”应为“ TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmF​​uY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 ='

但我明白了

'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbQpvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmF​​uY2Ugb2YgZGVsaWdodAppbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydAp2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4KZGdlLCBleGNlZWRzIHRo'

这是一回事,但最后还有“ KZGdlLCBleGNlZWRzIHRo”。有人可以帮我了解一下这些额外代码的来源吗?非常感谢

最佳答案

随意拒绝投票,但我想做出随机的猜测:尝试...

for (int i = 0; i < read_cnt - 2; i=i+3)


... 代替...

for (int i = 0; i < read_cnt; i=i+3)


我通过检查Wikipedia article试图了解您到底要做什么,但是我不能说我已经正确理解了整个过程。

关于c - 我的B64编码器无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21805997/

10-11 18:45