gpt4 book ai didi

C:Base 64 到二进制转换

转载 作者:行者123 更新时间:2023-11-30 16:51:14 25 4
gpt4 key购买 nike

我一直致力于用 C 语言实现 Base64 解码器。我一直在维基百科 page 等地方阅读有关 Base64 转换的信息。也可以在线使用converters检查我的工作。看起来很简单:只需将每个 Base64 字符替换为相应的 6 位二进制字符串即可!

只要要解码的 Base64 字符串是 4 的倍数,我的 Base64 到二进制解码就是正确的。如果字符串长度不是 4 的倍数,或者填充存在等号,则我的代码不会与在线转换器的结果匹配。

我以为我理解了填充——只需用零替换“=”字符(6,代表 6 位)。然而,当使用它时,我仍然不匹配转换器的结果。

这是我编写的代码:

int main(void){

printf("Testing b642bin ...\n\n");
printf("Case 1: Converting 'AA==' to bin:\n");
printf("Expected Result: 000000000000000000000000\n");
printf("Actual Result: %s\n\n", b642bin("AA=="));
printf("Case 2: Converting '+aHg' to bin:\n");
printf("Expected Result: 111110011010000111100000\n");
printf("Actual Result: %s\n\n", b642bin("+aHg"));
printf("Case 3: Converting 'kNSHd94m7d+=' to bin:\n");
printf("Expected Result: 1001000011010100100001110111011111011110001001101110110111011111\n");
printf("Actual Result: %s\n\n", b642bin("kNSHd94m7d+="));

return 0;
}

char bin6_table[65][7] = {"000000", "000001", "000010", "000011", "000100",
"000101","000110", "000111", "001000", "001001",
"001010", "001011", "001100", "001101", "001110",
"001111", "010000", "010001", "010010", "010011",
"010100", "010101", "010110", "010111", "011000",
"011001", "011010", "011011", "011100", "011101",
"011110", "011111", "100000", "100001", "100010",
"100011", "100100", "100101", "100110", "100111",
"101000", "101001", "101010", "101011", "101100",
"101101", "101110", "101111", "110000", "110001",
"110010", "110011", "110100", "110101", "110110",
"110111", "111000", "111001", "111010", "111011",
"111100", "111101", "111110", "111111", "000000"};

char base64_table[65] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/','='};

char* b64Char2bin(char b64){

int n = 64;
int k;
char *bin;

for(k=0;k<n;k++){
if (b64 == base64_table[k]) {
bin = bin6_table[k];
break;
}
}
return bin;
}

char* b642bin(char *b64_str) {

int i;
size_t len = strlen(b64_str);

char* bin_str = (char*)malloc(((len * 6) + 1) * sizeof(char));
for (i = 0; i < (int)len; i++) {
const char* binSextet = b64Char2bin(b64_str[i]);
memcpy(&bin_str[6*i], binSextet,7);
}

return bin_str;
}

输出如下所示:

测试 b642bin ...

Case 1: Converting 'AA==' to bin:
Expected Result: 000000000000000000000000
Actual Result: 000000000000000000000000

Case 2: Converting '+aHg' to bin:
Expected Result: 111110011010000111100000
Actual Result: 111110011010000111100000

Case 3: Converting 'kNSHd94m7d+=' to bin:
Expected Result: 1001000011010100100001110111011111011110001001101110110111011111
Actual Result: 100100001101010010000111011101111101111000100110111011011101111110000000

如果我提供的转换器是正确的,那么我不理解Base64。显然,您并不是简单地将每个字符替换为相应的 6 位二进制数。为什么情况 1 和 2 正确,而情况 3 不正确?

最佳答案

字节(好吧,如果您想了解所有技术,则为八位字节)是 8 位长。 Base64 一次编码 6 位。当编码的字节数不是三的倍数,因此位数不是六的倍数时,使用填充。使用填充解码 Base64 时,您不会输出更多个零位,而是输出更少位以产生正确的字节数。

举个具体的例子:

Base64:////
二进制:11111111 11111111 11111111

Base64://8=
二进制:11111111 11111111

Base64:/w==
二进制:11111111

关于C:Base 64 到二进制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41863671/

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