1. base64 c语言实现
#include<stdio.h>
#include <string.h>
char base64[1000];
char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int main()
{
int i = 0;//需要加密字符串编号
int j = 0;//加密之后字符串编号
int len;//字符长度
int flag;//判断倍数
char str[1000];
printf("需要加密的字符串:\n");
gets_s(str);
len = (int)strlen(str);//输入字符串的长度
//123456 78 1234 5678 12 345678
flag = len % 3;
//判断是否为三个倍数
for (i = 0, j = 0; i <= len - 3; i += 3, j += 4)
{
base64[j] = base[str[i] >> 2];//取第一个字符的前6位
base64[j + 1] = base[(((str[i] & 3) << 4) | str[i + 1] >> 4)];
//取第一个字符的后两位与第二个字符的前四位
base64[j + 2] = base[((str[i + 1] & 15) << 2) | str[i + 2] >> 6];
//取第二个字符的后四位和第三个字符的前两位
base64[j + 3] = base[str[i + 2] & 63];
//取第三个字符最后六位
}
//123456 78
if (flag == 1)
{
base64[j] = base[str[len - 1] >> 2];
base64[j + 1] = base[(str[len - 1] << 4) & 63];
base64[j + 2] = '=';
base64[j + 3] = '=';
} else if (flag == 2)//123456 78 1234 567800
{
base64[j] = base[str[len - 2] >> 2];
base64[j + 1] = base[((str[len - 2] & 3) << 4) | (str[len - 1] >> 4)];
base64[j + 2] = base[(str[len - 1] << 2)& 63];
base64[j + 3] = '=';
}
printf("经过base64表加密后\n");
puts(base64);
return 0;
}
2.语句解读
首先,我是将每三个字符放在一起处理,因为三个字符是24bit,同样是8和6的倍数。
base64[j] = base[str[i] >> 2];
取第一个字符的前6位,>>是将位数右移,即原为1000 0011 变为了 1000 00
从8位变成了6位
base64[j + 1] = base[(((str[i] & 3) << 4) | str[i + 1] >> 4)];
取第一个字符的后2位与第二个字符的前4位
我在进行移位前先对第一个字符进行了 & 3 的运算
2位的二进制的最大值为3
因为3的二进制是11,如果进行了 1101 & 11 的运算 结果为 0001
目的是使除了我需要部分的数值不变以外,将其他位置改为0
然后左移4位,成为第二个base字符的5,6两位
在加上第二个字符的后4位
base64[j + 2] = base[((str[i + 1] & 15) << 2) | str[i + 2] >> 6];
取第二个字符的后4位和第三个字符的前两位
同样先进行了 & 15 运算,只取所需要的值,与上面同理
因为我这里是需要第二个字符的后4位,而4位2进制的最大值为15
base64[j + 3] = base[str[i + 2] & 63];
取第三个字符最后六位

这一步很重要,因为当最后凑不齐3个字符的时候,要自动补0,补到24位
注意补零所得到的00000类型用‘=’表示
3.验证
这里推荐一个网站,可以快速的得到结果
链接: base64的加密与解密

ok 没有问题


被折叠的 条评论
为什么被折叠?



