核心原理
1. 获取第一个字符8个 bit 的前6位,作为 base64编码的第一位;
2. 获取第一个字符8个 bit 的后2位和第二个字符8个 bit 的前4位,作为 base64 编码的第二位;
3. 获取第二个字符8个 bit 的后4位和第三个字符8个 bit 的前2位,作为 base64编码的第三位;
4. 获取第三个字符8个 bit 的后6位,作为 base64编码的第四位;
如此3个字符可编码 base64 为4个字符,当位数不够时补 0 来满足一个字符,且要实现编码后的位数为4的倍数,不足的用 “=” 代替。
利用 ASCII 码与 base64 码进行转换的方法
1.编码
2.解码
if(*m>='A'&&*m<='Z')
{
*m-='A';
continue;
}
if(*m>='a'&&*m<='z')
{
*m-='a';
*m+=26;
continue;
}
if(*m=='+')
{
*m=62;
continue;
}
if(*m=='/')
{
*m=63;
continue;
}
if(*m=='=')
{
*m=0;
continue;
}
*m-='0';
*m+=52;
参考代码
直接对字符串进行转换
//base64.h
#pragma once
#ifndef BASE64_H_INCLUDED
#define BASE64_H_INCLUDED
#include
#include
#include
#include
char* base64_encode(char* binData, char* base64, int binLength);
char* base64_decode(char const* base64Str, char* debase64Str, int encodeStrLen);
void Menu();
void decode();
void encode();
#endif // BASE64_H_INCLUDED
//base64.c
#pragma warning(disable:4996)
#include"base64.h"
char base64char[] = {
'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','+', '/', '\0'
};
char c;
void Menu()
{
printf("***************\n");
printf("*1、base64加密\n");
printf("*2、base64解密\n");
printf("*3、退出程序\n");
printf("***************\n");
}
void encode()
{
do
{
system("cls");
printf(" ---- base64_encode ----\n\n");
char soursedata[1024];
scanf("%s", &soursedata);
getchar(); //吸收缓冲区的换行符
char* result = (char*)malloc(sizeof(char) * 1024); //申请返回字符串空间
memset(result, 0, sizeof(char) * 1024); //初始化字符串空间
printf("\t\t\n%s\n", base64_encode(soursedata, result, (int)strlen(soursedata)));
printf("\nWhether to continue:(Y/N)\n"); //是否继续进行操作
} while ((c = getch())!='N'&& c != 'n');
}
void decode()
{
do {
system("cls");
printf(" ---- base64_dncode ----\n\n");
char soursedata[1024];
scanf("%s", &soursedata);
getchar(); //吸收缓冲区的换行符
char* result = (char*)malloc(sizeof(char) * 1024);
memset(result, 0, sizeof(char) * 1024);
printf("\t\t\n%s\n",base64_decode((char const*)soursedata, result, (int)strlen(soursedata)));
printf("\nWhether to continue:(Y/N)\n");
} while ((c = getch()) != 'N' && c != 'n');
}
char* base64_encode(char* binData, char* base64, int binLength)
{
int i = 0;
int j = 0;
int current = 0;
for (i = 0; i < binLength; i += 3) {
//获取第一个6位
current = (*(binData + i) >> 2) & 0x3F;
*(base64 + j++) = base64char[current];
//获取第二个6位的前两位
current = (*(binData + i) << 4) & 0x30;
//如果只有一个字符,那么需要做特殊处理
if (binLength <= (i + 1)) {
*(base64 + j++) = base64char[current];
*(base64 + j++) = '=';
*(base64 + j++) = '=';
break;
}
//获取第二个6位的后四位
current |= (*(binData + i + 1) >> 4) & 0xf;
*(base64 + j++) = base64char[current];
//获取第三个6位的前四位
current = (*(binData + i + 1) << 2) & 0x3c;
if (binLength <= (i + 2)) {
*(base64 + j++) = base64char[current];
*(base64 + j++) = '=';
break;
}
//获取第三个6位的后两位
current |= (*(binData + i + 2) >> 6) & 0x03;
*(base64 + j++) = base64char[current];
//获取第四个6位
current = *(binData + i + 2) & 0x3F;
*(base64 + j++) = base64char[current];
}
*(base64 + j) = '\0';
return base64;
}
char* base64_decode(char const* base64Str, char* debase64Str, int encodeStrLen)
{
int i = 0;
int j = 0;
int k = 0;
char temp[4] = "";
for (i = 0; i < encodeStrLen; i += 4) {
for (j = 0; j < 64; j++) {
if (*(base64Str + i) == base64char[j]) {
temp[0] = j;
}
}
for (j = 0; j < 64; j++) {
if (*(base64Str + i + 1) == base64char[j]) {
temp[1] = j;
}
}
for (j = 0; j < 64; j++) {
if (*(base64Str + i + 2) == base64char[j]) {
temp[2] = j;
}
}
for (j = 0; j < 64; j++) {
if (*(base64Str + i + 3) == base64char[j]) {
temp[3] = j;
}
}
*(debase64Str + k++) = ((temp[0] << 2) & 0xFC) | ((temp[1] >> 4) & 0x03);
if (*(base64Str + i + 2) == '=')
break;
*(debase64Str + k++) = ((temp[1] << 4) & 0xF0) | ((temp[2] >> 2) & 0x0F);
if (*(base64Str + i + 3) == '=')
break;
*(debase64Str + k++) = ((temp[2] << 6) & 0xF0) | (temp[3] & 0x3F);
}
return debase64Str;
}
//main.c
#pragma warning(disable:4996)
#include"base64.h"
int main()
{
Menu();
char a;
scanf("%c", &a);
switch (a)
{
case '1':
encode();
break;
case '2':
decode();
break;
case '3':
exit(0);
}
return 0;
}