带移位的 Base64 实现
Base64 implementation with bit shifting
我尝试实现一个 base64 编码器。我有这个算法:
while (len--)
{
char_array_3[i++] = *(data++);
if (i == 3)
{
char_array_4[0] = (char_array_3[0] & 252) >> 2; //This line.
char_array_4[1] = ((char_array_3[0] & 3) << 4) + ((char_array_3[1] & 240) >> 4);
char_array_4[2] = ((char_array_3[1] & 15) << 2) + ((char_array_3[2] & 192) >> 6);
char_array_4[3] = char_array_3[2] & 63;
for (i = 0; i < 4; i++) {
ret += base64_chars[char_array_4[i]];
}
i = 0;
}
}
为什么我应该char_array_3[0] & 252
?我只能使用 >> 2
。由于...
例如,如果我把这个字符 H
:
H -> 01001000
我可以做位移:
01001000 >> 2 = 000100100
或使用and (&)
...
252 -> 11111100
01001000 & 11111100 = 01001000
我要相同的数字...
然后需要这样做:
01001000 >> 2 = 000100100
我可以删除号码 252
、3
、240
等吗?
May I remove the number 252, 3, 240 etc.?
不,不是全部。在右移和二进制掩码 252、240 和 192 的情况下,它们是多余的,您可以删除它们。但是 3 15 和 63 不是多余的,因为你会传播你不应该传播的位。
我尝试实现一个 base64 编码器。我有这个算法:
while (len--)
{
char_array_3[i++] = *(data++);
if (i == 3)
{
char_array_4[0] = (char_array_3[0] & 252) >> 2; //This line.
char_array_4[1] = ((char_array_3[0] & 3) << 4) + ((char_array_3[1] & 240) >> 4);
char_array_4[2] = ((char_array_3[1] & 15) << 2) + ((char_array_3[2] & 192) >> 6);
char_array_4[3] = char_array_3[2] & 63;
for (i = 0; i < 4; i++) {
ret += base64_chars[char_array_4[i]];
}
i = 0;
}
}
为什么我应该char_array_3[0] & 252
?我只能使用 >> 2
。由于...
例如,如果我把这个字符 H
:
H -> 01001000
我可以做位移:
01001000 >> 2 = 000100100
或使用and (&)
...
252 -> 11111100
01001000 & 11111100 = 01001000
我要相同的数字...
然后需要这样做:
01001000 >> 2 = 000100100
我可以删除号码 252
、3
、240
等吗?
May I remove the number 252, 3, 240 etc.?
不,不是全部。在右移和二进制掩码 252、240 和 192 的情况下,它们是多余的,您可以删除它们。但是 3 15 和 63 不是多余的,因为你会传播你不应该传播的位。