嗨,我做了一个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;
}当我在维基百科上输入这样一个例子:“人之所以与众不同,不仅是因为他的理性,而且是因为其他动物的这种独特的激情,这是一种心灵的欲望,通过对源源不断的、不知疲倦的一代知识的坚持不懈的愉悦,超越了任何肉体快感的短暂激烈。”它应该是'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=‘。
但我得到了
'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbQpvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodAppbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydAp2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4KZGdlLCBleGNlZWRzIHRo‘
这是相同的事情,但在结尾'KZGdlLCBleGNlZWRzIHRo‘上有一点额外的东西。有没有人能帮我弄明白这些额外的代码是从哪里来的?非常感谢
发布于 2014-02-16 09:48:44
请随意否决,但我想随意猜测一下:尝试……
for (int i = 0; i < read_cnt - 2; i=i+3)..。而不是。
for (int i = 0; i < read_cnt; i=i+3)我试图通过检查Wikipedia article来了解您到底想要做什么,但我不能说我已经正确地理解了整个事情。
发布于 2014-02-16 09:49:35
您的代码中有几个问题。
i3 = inbufi+2;i2 = inbufi+1 << 8;
你真的应该添加检查,因为在有符号整数上使用shift时,不能在0..read_cnt-1
i3 = (unsigned char*)inbufi+2;i2 = (unsigned char*)inbufi+1 << 8;i1 = (unsigned *)inbufi << 16;
原因是char是一种带符号类型,当字符设置了位7(超过0x7f)时,它会扩展到int,并设置所有高位
另外,在编码循环后,unsigned.
combine outbuf。您正在尝试查找0,但它不在那里...
您可以尝试执行以下操作,而不是多个填充:
}
read_cnt位置= read_cnt * 4;开关(read_cnt % 3) {情况1: outbufpos++ = '=';情况2: outbufpos++ = '=';情况0: outbufpos++ = '\r';outbufpos++ = '\n';outbufpos = 0;outbufpos应为ssize_thttps://stackoverflow.com/questions/21805997
复制相似问题