基于BASE64原理编码解码实现-----C语言

来源:互联网 发布:矩阵迹的性质及证明 编辑:程序博客网 时间:2024/05/16 12:01

关于BASE64

是网络上最常见的用于传输8bit字节代码的编码方式之一.可用于在HTTP环境下传递较长的标识信息.

原理

内存中一个字符占八位,以三个字符为一组,共占24个字节,将字符转化为ASCII值下的二进制表示,一共就是24位的二进制码,然后以六个二进制码为一组构造base64编码,每六位二进制码对应的十进制数即为base64转换表中对应的编码

实现

1.建立字符串数组

char binary[8] = {'0','0','0','0','0','0','0','0'};

用于保存字符二进制码值

char binary_base[6] = { '0','0','0','0','0','0' };

用于保存base转换表索引的二进制码值,binary分割而来

const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

用于保存base64转换表

char base[24];

用于保存三个字符的ASCII二进制码值的组合,以实现编码与解码时的按组操作

char s[1000];

保存输入

2.建立函数

编码

void charToString(char c)

保存字符ASCII值的二进制形式到binary数组中

int toascii(char c)返回字符cascii

void creatGroup(char a,char b,char c)

合并三位字符ASCII值的二进制并保存到base数组中

每保存一位字符后要注意置零binary数组

异常1

总字符按三个一组时剩余一个字符的情况

保存一位字符的ASCII的二进制码值,剩余全部置零

异常2

总字符按三个一组时剩余两个字符的情况

保存两位字符的ASCII的二进制码值,剩余全部置零

int binaryToNum(char b[],int n)

将存储二进制的长度为n的数组b[]转换为整数

void translation() 

base数组中存储的24位二进制码值分割为四组,每组中二进制码值对应的整数为base64转换表中的索引值,base64数组中的下标

异常1:

void translation1() 

总字符按三个一组时剩余一个字符的情况

base数组中的24位二进制码值仅输出前12,即输出两位的base64编码,并于之后添加"=="

异常2:

void translation2()

总字符按三个一组时剩余两个字符的情况

base数组中的24位二进制码值仅输出前18,即输出三位的base64编码,并于之后添加"="

解码

void baseToString(char c) 

base64编码串中的字符对应base64数组的位置的二进制码存放在binary_base数组中

void creatGroup_base(char a, char b, char c, char d)

将base64编码中的四位字符的的编号的二进制码存储在base字符串数组中

异常1:

按四个一组时最后一组末尾含有两个'=',仅翻译前两个字符,base字符串中最后12位置零

异常2:

按四个一组时最后一组末尾含有一个'=',仅翻译前三个字符,base字符串中最后6位置零

void transbase() 

base数组中24位分为三组,每组中的二进制码值的整数值即为对应解码中的字符的ASCII

异常1:

按四个一组时最后一组末尾含有两个'=',仅翻译base数组中的第一组

异常2:

按四个一组时最后一组末尾含有一个'=',仅翻译base数组中的前两组

 

/*基于base64的编码与解码*/#include<stdio.h>#include<ctype.h>#include<string.h>#include<math.h>const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";char binary[8] = {'0','0','0','0','0','0','0','0'};char binary_base[6] = { '0','0','0','0','0','0' };char base[24];char s[1000];void emptyBinary()   //重置binary数组{for (int i = 0; i < 8; i++){binary[i] = '0';}}void emptyBinary_base()  //重置binary_base数组{for (int i = 0; i < 6; i++){binary_base[i] = '0';}}   void charToString(char c)             //将字符的ASCII码值转化为二进制并存储在字符数组binary中{int  num = toascii(c);int flag = 7;while (num){int i=0;i = num%2;if (i == 1){binary[flag] = '1';flag--;}else{binary[flag] = '0';flag--;}num/= 2;}}void baseToString(char c)                             //将base64编码串中的字符对应base64数组的位置的二进制码存放在binary_base数组中{int findPos(char c);int num = findPos(c);int flag = 5;while (num){int i = 0;i = num % 2;if (i == 1){binary_base[flag] = '1';flag--;}else{binary_base[flag] = '0';flag--;}num /= 2;}}void creatGroup(char a,char b,char c)             //将三位字符的ASCII值的二进制码存储在base字符串数组中{int i = 0;emptyBinary();charToString(a);for (i = 0; i < 8; i++){base[i] = binary[i];}emptyBinary();charToString(b);for (i = 8; i < 16; i++){base[i] = binary[i - 8];}emptyBinary();charToString(c);for (i = 16; i < 24; i++){base[i] = binary[i - 16];}}void creatGroup_base(char a, char b, char c, char d)   //将base64编码中的四位字符的的编号的二进制码存储在base字符串数组中{int i=0;emptyBinary_base();baseToString(a);for (i = 0; i < 6; i++){base[i] = binary_base[i];}emptyBinary_base();baseToString(b);for (i = 6; i < 12; i++){base[i] = binary_base[i - 6];}if (c == '='){for (i = 12; i < 24; i++){base[i] = '0';}return;}emptyBinary_base();baseToString(c);for (i = 12; i <18 ; i++){base[i] = binary_base[i - 12];}if (d == '='){for (i = 18; i < 24; i++){base[i] = '0';}return;}emptyBinary_base();baseToString(d);for (i = 18; i < 24; i++){base[i] = binary_base[i - 18];}}int binaryToNum(char b[],int n)                             //将二进制字符串转化为数字{int num = 0;for (int i = 0; i < n; i++){if (b[i] == '1'){num += (int)pow(2, n - i - 1);}}return num;}void translation()                  //无异常情况下将代码以base64方式加密{for (int j = 0; j < 4; j++){for (int i = 0; i < 6; i++){binary_base[i] = base[j * 6 + i];}printf("%c", base64[ binaryToNum(binary_base,6) ]);}}void translation1()           //异常1{for (int j = 0; j < 2; j++){for (int i = 0; i < 6; i++){binary_base[i] = base[j * 6 + i];}printf("%c", base64[binaryToNum(binary_base, 6)]);}printf("==");}void translation2()          //异常2{for (int j = 0; j < 3; j++){for (int i = 0; i < 6; i++){binary_base[i] = base[j * 6 + i];}printf("%c", base64[binaryToNum(binary_base, 6)]);}printf("=");}void transbase()            //无异常情况下将代码以base64方式解密{for (int j = 0; j < 3; j++){for (int i = 0; i < 8; i++){binary[i] = base[j * 8 + i];}printf("%c", binaryToNum(binary,8));emptyBinary();}}void transbase1()          //异常1{for (int j = 0; j < 2; j++){for (int i = 0; i < 8; i++){binary[i] = base[j * 8 + i];}printf("%c", binaryToNum(binary, 8));emptyBinary();}}void transbase2()          //异常2{for (int i = 0; i < 8; i++){binary[i] = base[i];}printf("%c", binaryToNum(binary, 8));emptyBinary();}void encode()                                    //对输入的语句进行base64编码{printf("Inut the file\n");gets_s(s);int i = 0;while (s[i] != NULL){i++;}printf("BASE64编码如下\n");for (int loop = 0 ; loop < i/3; loop++){creatGroup(s[loop*3], s[loop*3 + 1], s[loop*3 + 2]);translation();}if (i % 3 == 2){creatGroup(s[i - 2], s[i - 1], '\0');translation2();}else if (i % 3 == 1){creatGroup(s[i - 1], '\0', '\0');translation1();}printf("\n");}int findPos(char c)              //返回base64编码中字符在base64中的位置{int i = 0;while (base64[i] != c){i++;}return i;}void decode()                //对输入语句进行base64解码{printf("Input the BASE64 file\n");gets_s(s);int i = 0;while (s[i] != NULL){i++;}printf("base64解码如下\n");for (int loop = 0; loop < (i / 4)-1; loop++){creatGroup_base(s[loop * 4], s[loop * 4 + 1], s[loop * 4 + 2], s[loop * 4 + 3]);transbase();}if (s[i - 1] == '='&&s[i - 2] != '='){creatGroup_base(s[i - 4], s[i - 3], s[i - 2], '=');transbase1();}else if (s[i - 1] == '='&&s[i - 2] == '='){creatGroup_base(s[i - 4], s[i - 3], '=', '=');transbase2();}else{creatGroup_base(s[i - 4], s[i - 3], s[i - 2], s[i - 1]);transbase();}printf("\n");}void menu(){int i;printf("输入想要实现的功能\n1.base64编码\n2.base64解码\n");scanf_s("%d", &i);getchar();switch (i){case 1:encode();break;case 2:decode();break;default:return;break;}menu();}int main()         //主程序{menu();return 0;}

1 0
原创粉丝点击