基于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)返回字符c的ascii值
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;}
- 基于BASE64原理编码解码实现-----C语言
- base64编码解码的实现(C语言)
- base64编码解码的实现(C语言)
- Base64编码解码的实现(C语言)
- Base64编码解码c语言实现
- Base64编码解码C语言实现
- Base64编码解码的实现(C语言)
- base64 编码解码 c语言实现
- base64编码、解码的C语言实现
- Base64编码解码C语言实现
- base64编码、解码的C语言实现
- base64编码、解码的C语言实现
- base64编码、解码的C语言实现
- BASE64编码、解码的C语言实现
- C语言实现Base64编码/解码
- 用C语言实现的Base64编码&amp;解码
- base64编码/解码的实现(C语言)
- Base64编码原理及编码、解码实现
- MyBatis集合Spring(三)之mapper
- js获取子节点childNodes和children的区别
- 一个简单java程序的运行全过程
- 贪心算法——寻找剩余最大数
- 酒店管理系统_06_-Servlet版本-添加用户数据
- 基于BASE64原理编码解码实现-----C语言
- POJ 2104 K-th Number (划分树,主席树写过了,这次是整体二分解法 )
- LeetCode - 367. Valid Perfect Square
- 酒店管理系统_07-Servlet版本-用户列表和删除用户-EL表达式
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- POJ-2981 Strange Way to Express Integers(中国剩余定理)
- java基于ssm框架整合的多数据源配置
- PreparedStatement的使用
- Java每一天4 Thinking P268