gpt4 book ai didi

c - 我的 B64 编码器无法工作

转载 作者:行者123 更新时间:2023-11-30 17:39:27 25 4
gpt4 key购买 nike

嗨,我制作了一个 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;
}

当我输入维基百科上的例子时,“人之所以与众不同,不仅在于他的理性,还在于他的独特热情”其他动物,这是心灵的欲望,通过持久的快乐在不断不知疲倦地产生知识的过程中,超越了短暂的任何肉体快感的强烈程度。”,应该是“TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmF​​uY2Ugb2YgZGVsaWdodCBpbiB0aGUGY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4='

但我明白了

'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbQpvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmF​​uY2Ugb2YgZGVsaWdodAppbiB0aGUGY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydAp2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4KZGdlLCBleGNlZWRzIHRo'

这是同样的事情,但末尾有一点额外的“KZGdlLCBleGNlZWRzIHRo”。有人可以帮我理解这个额外的代码来自哪里吗?非常感谢

最佳答案

您的代码中存在一些问题。

  1. 您正在读取超出数据缓冲区的内容。

    i3 = inbuf[i+2];
    i2 = inbuf[i+1] << 8;

    您确实应该添加检查,以免获取 [0..read_cnt-1] 之外的值

  2. 您正在对有符号整数使用移位。当处理非 ASCII 文本或二进制数据时,这会给你带来有趣的结果

    i3 = (unsigned char*)inbuf[i+2];
    i2 = (unsigned char*)inbuf[i+1] << 8;
    i1 = (unsigned char*)inbuf[i] << 16;

    原因是 char 是有符号类型,当 char 设置了第 7 位(超过 0x7f)

    此外combine应该无符号

  3. 编码循环后您没有终止 outbuf

    您正在尝试查找0,但它不在那里...

    您可以尝试以下方法,而不是使用多个填充:

    int pos = read_cnt * 4;
    switch (read_cnt % 3)
    {
    case 1: outbuf[pos++] = '=';
    case 2: outbuf[pos++] = '=';
    case 0: outbuf[pos++] = '\r';
    outbuf[pos++] = '\n';
    outbuf[pos] = 0;
    }
  4. read_cnt 应该是 ssize_t

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com