一、base64是什么?
由26个大小写英文字母,0~9的10个数字和两个字符(斜杠'/'与加号'+')组成。 正因为它们都是可见的,所以被用来对传递在前端和后台之间的信息(尤其是不可见的)进行编码,比如图片,由ASCII码组成,其中含有控制字符,是不可见的。
二、怎么编码?
一个ASCII码占8位二进制,一个base64码占6位二进制(因为2的6次方是64),所以,三个ASCII码可以换成四个base64码,如下图:
ASCII码 |
‘O’ |
‘N’ |
‘E’ |
|||
十进制 |
79 |
78 |
69 |
|||
二进制(8位) |
01001111 |
01001110 |
01000101 |
|||
二进制(6位) |
010011 |
110100 |
111001 |
000101 |
||
十进制 |
19 |
52 |
57 |
5 |
||
BASE64码 |
‘T’ |
‘0’ |
‘5’ |
‘F’ |
“ONE”转换成了“T05F”
当然,如果剩下了2个或者1个ASCII码,则需要用'='补充,比如,剩下1个ASCII码,
ASCII码 |
‘O’ |
空 |
空 |
||
十进制 |
79 |
空 |
空 |
||
二进制(8位) |
01001111 |
空 |
空 |
||
二进制(6位) |
010011 |
11 0000 |
空 |
空 |
|
十进制 |
19 |
48 |
空 |
空 |
|
BASE64码 |
‘T’ |
‘w’ |
‘=’ |
‘=’ |
“O”转换成“Tw==”, 用'='凑成三个字节,即转换成二进制是24位。
三、怎么解码?
解码就是上面的逆过程,只是不考虑等号‘=’。
四、我的代码
头文件
/* 这是一份关于函数返回值定义的头文件。 */ #ifndef _GENERAL_H_ #define _GENERAL_H_ /* 附加类型 */ typedef unsigned char uChar; typedef unsigned int uInt; /* 返回状态值 */ #define STATUS int #define OK 6 #define ERROR -6 #endif
/* 这是一份关于函数返回值定义的头文件。 */ #ifndef _GENERAL_H_ #define _GENERAL_H_ /* 附加类型 */ typedef unsigned char uChar; typedef unsigned int uInt; /* 返回状态值 */ #define STATUS int #define OK 6 #define ERROR
/* 这是一份关于Base64码和ASCII码相互转换的接口声明文件 */ #ifndef _BASE64_H_ #define _BASE64_H_ #include "general.h" /* ** 把base64码转换为ASCII码。 ** ** base64 -- 目标串 ** asciip -- 返回结果串 ** asciiLenp -- 返回结果串的长度 ** 返回值,如果转换成功返回OK;否则返回ERROR。 */ STATUS Base64ToASCII(char const * base64, uChar ** const asciip, uInt * const asciiLenp); /* ** 把ASCII码转换为base64码。 ** ** ascii -- 目标串 ** asciiLen -- 目标串的长度 ** base64p -- 返回结果串 ** 返回值,如果转换成功返回OK;否则返回ERROR。 */ STATUS ASCIIToBase64(uChar const * ascii, uInt asciiLen, char ** const base64p); #endif
源文件

1 /* 这是一份关于Base64码和ASCII码相互转换的接口定义文件 */ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <math.h> 6 #include "general.h" 7 #include "base64.h" 8 9 #define EQUAL 64 //base64码的等号下标 10 static char const base64Tray[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; //存放base64码 11 static char const *binaries [] = { //存放base64码的二进制形式 12 "000000", "000001", "000010", "000011", "000100", "000101", "000110", "000111", 13 "001000", "001001", "001010", "001011", "001100", "001101", "001110", "001111", 14 "010000", "010001", "010010", "010011", "010100", "010101", "010110", "010111", 15 "011000", "011001", "011010", "011011", "011100", "011101", "011110", "011111", 16 "100000", "100001", "100010", "100011", "100100", "100101", "100110", "100111", 17 "101000", "101001", "101010", "101011", "101100", "101101", "101110", "101111", 18 "110000", "110001", "110010", "110011", "110100", "110101", "110110", "110111", 19 "111000", "111001", "111010", "111011", "111100", "111101", "111110", "111111", 20 }; 21 22 /* 23 ** 把8位二进制转换为一个十进制 24 ** 25 ** buffer -- 指向待转换的8位二进制字符串 26 ** valuep -- 指向存放十进制的地址 27 ** 返回值,空。 28 */ 29 static void 30 ConvertItToASCII(char const *buffer, uChar * const valuep) 31 { 32 uChar value; 33 uInt temp = 0; 34 int i; 35 36 for(i = 0; i < 8; i ++) 37 { 38 temp += (buffer [i] - '0') * (int)pow(2, 7 - i); 39 } 40 value = (uChar)temp; 41 *valuep = value; 42 } 43 44 /* 45 ** 把6位二进制转换为一个十进制 46 ** 47 ** buffer -- 指向待转换的6位二进制字符串 48 ** valuep -- 返回转换的十进制 49 ** 返回值,空。 50 */ 51 static void 52 ConvertItToBase64(char const *buffer, int * const valuep) 53 { 54 int value = 0; 55 int i; 56 57 for(i = 0; i < 6; i ++) 58 { 59 value += (buffer [i] - '0') * (int)pow(2, 5 - i); 60 } 61 *valuep = value; 62 } 63 64 /* 65 ** 把一个ASCII码转换为8位二进制串 66 ** 67 ** value -- 待转换的整数 68 ** binaryp -- 返回8位二进制串 69 ** 返回值,空。 70 */ 71 static void 72 ConvertIt(uChar value, char ** const binaryp) 73 { 74 char *binary = NULL; 75 int count = 8; 76 77 binary = (char *)malloc(9 * sizeof(char)); 78 if(binary == NULL) 79 { 80 fprintf(stdout, "Error at ConvertIt(): 内存不足 "); 81 exit(EXIT_FAILURE); 82 } 83 84 binary [count] = '