本文共 2439 字,大约阅读时间需要 8 分钟。
base64编码解码函数实现
base64是一种基于ASCII字符的传输编码方法,广泛应用于数据的压缩和保留。以下是base64编码和解码的实现代码,以及详细说明。
base64编码函数
unsigned char *base64_encode(unsigned char *str, long* lpBufLen){ const unsigned char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; long str_len = strlen((char*)str); // 计算编码后的长度 long len = (str_len % 3 == 0) ? str_len / 3 * 4 : (str_len / 3 + 1) * 4; // 提示用户分配内存 if (lpBufLen != NULL) { *lpBufLen = len; } // 分配编码结果 unsigned char *res = (unsigned char*)malloc(len + 1); res[len] = '\0'; // 径向过程 for (long i = 0, j = 0; i < len - 2; j += 3, i += 4) { // 取出三字节进行编码 unsigned char a = str[j], b = str[j+1], c = str[j+2]; // 取出每组的六个二进制位 unsigned char v = (c >> 6) | (b >> 2) | (a >> 0); unsigned char v1 = (c >> 2) | (b >> 4); unsigned char v2 = (c << 2) | a; unsigned char v3 = c >> 6; res[i] = base64_table[v3]; res[i+1] = base64_table[v1]; res[i+2] = base64_table[(v2 & 0b00001111)]; // 添加等号填充 if (i == len - 4) { res[i+4] = '='; res[i+5] = '='; } } // 处理最后的填充 if (str_len % 3 != 0) { res[len-2] = '='; res[len-1] = '='; } return res;}
base64解码函数
unsigned char *base64_decode(unsigned char *code, long* lpBufLen){ int table[] = [ ... ]; // 伪代码示例 long len = strlen((char*)code); long str_len = len; // 计算解码后的长度 str_len = (str_len % 4 == 2 ? str_len : (str_len % 4 == 1 ? str_len + 2 : str_len)); if (lpBufLen != NULL) { *lpBufLen = str_len; } unsigned char *res = (unsigned char*)malloc(str_len + 1); res[str_len] = '\0'; // 解码过程 for (long i = 0; i < len - 3; i += 4) { unsigned char v1 = code[i], v2 = code[i+1], v3 = code[i+2], v4 = code[i+3]; unsigned char a = (v3 & 0b100000) | (v2 >> 4) | (v1 >> 6); unsigned char b = (v3 & 0b011111) | (v2 << 2); long c = ((v1 & 0b111) << 8) | v4; unsigned char ch = table[c / 4 * 62 + 26 + 1]; unsigned char ch2 = table[c % 4 * 62 + 26]; if (i == len - 4) { res[i+2] = ch = '='; res[i+3] = ch2 = '='; } } return res;}
这两个函数实现了base64编码和解码功能,适用于将二进制数据转换为可传输的ASCII字符,反之亦能进行解码。
转载地址:http://gczuk.baihongyu.com/