首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的B64编码器不工作

我的B64编码器不工作
EN

Stack Overflow用户
提问于 2014-02-16 09:13:00
回答 2查看 295关注 0票数 0

嗨,我做了一个64位的编码器,其中一些可以工作,但不是100%,这让我抓狂为什么它不能工作。

代码语言:javascript
复制
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;
}

当我在维基百科上输入这样一个例子:“人之所以与众不同,不仅是因为他的理性,而且是因为其他动物的这种独特的激情,这是一种心灵的欲望,通过对源源不断的、不知疲倦的一代知识的坚持不懈的愉悦,超越了任何肉体快感的短暂激烈。”它应该是'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=‘。

但我得到了

'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbQpvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodAppbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydAp2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4KZGdlLCBleGNlZWRzIHRo‘

这是相同的事情,但在结尾'KZGdlLCBleGNlZWRzIHRo‘上有一点额外的东西。有没有人能帮我弄明白这些额外的代码是从哪里来的?非常感谢

EN

回答 2

Stack Overflow用户

发布于 2014-02-16 09:48:44

请随意否决,但我想随意猜测一下:尝试……

代码语言:javascript
复制
for (int i = 0; i < read_cnt - 2; i=i+3)

..。而不是。

代码语言:javascript
复制
for (int i = 0; i < read_cnt; i=i+3)

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-16 09:49:35

您的代码中有几个问题。

  1. 您正在通过数据缓冲区读取数据。

i3 = inbufi+2;i2 = inbufi+1 << 8;

你真的应该添加检查,因为在有符号整数上使用shift时,不能在0..read_cnt-1

  • You之外获取值。在处理非ASCII文本或二进制数据时,这将为您提供有趣的结果

i3 = (unsigned char*)inbufi+2;i2 = (unsigned char*)inbufi+1 << 8;i1 = (unsigned *)inbufi << 16;

原因是char是一种带符号类型,当字符设置了位7(超过0x7f)时,它会扩展到int,并设置所有高位

另外,在编码循环后,unsigned.

  • You不应该终止combine outbuf

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

您可以尝试执行以下操作,而不是多个填充:

}

  • read_cnt位置= read_cnt * 4;开关(read_cnt % 3) {情况1: outbufpos++ = '=';情况2: outbufpos++ = '=';情况0: outbufpos++ = '\r';outbufpos++ = '\n';outbufpos = 0;outbufpos应为ssize_t
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21805997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档