打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C语言base64编解码


百度词条

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

一般规则

 0. 源数据都是8位位宽的数据; 1. 相当于分组码,将源数据分为3个一组,每一组共24bits,采用每6位对应一个编码码字,那么3*8bits = 4*6its, 将3个数据映射成4个数据,由于编码的码字都是6位长度,换位10进制就是0-63,总共有64中可能性,这也是base64名字的来历; 2. 6bits对应10进制数对应的码字如最后的表;
  • 1
  • 2
  • 3
  • 4

C代码

编码

#include <stdio.h>#include <string.h>// 全局常量定义const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";const char padding_char = '=';/*编码代码* const unsigned char * sourcedata, 源数组* char * base64 ,码字保存*/int base64_encode(const unsigned char * sourcedata, char * base64){    int i=0, j=0;    unsigned char trans_index=0;    // 索引是8位,但是高两位都为0    const int datalength = strlen((const char*)sourcedata);    for (; i < datalength; i += 3){        // 每三个一组,进行编码        // 要编码的数字的第一个        trans_index = ((sourcedata[i] >> 2) & 0x3f);        base64[j++] = base64char[(int)trans_index];        // 第二个        trans_index = ((sourcedata[i] << 4) & 0x30);        if (i + 1 < datalength){            trans_index |= ((sourcedata[i + 1] >> 4) & 0x0f);            base64[j++] = base64char[(int)trans_index];        }else{            base64[j++] = base64char[(int)trans_index];            base64[j++] = padding_char;            base64[j++] = padding_char;            break;   // 超出总长度,可以直接break        }        // 第三个        trans_index = ((sourcedata[i + 1] << 2) & 0x3c);        if (i + 2 < datalength){ // 有的话需要编码2个            trans_index |= ((sourcedata[i + 2] >> 6) & 0x03);            base64[j++] = base64char[(int)trans_index];            trans_index = sourcedata[i + 2] & 0x3f;            base64[j++] = base64char[(int)trans_index];        }        else{            base64[j++] = base64char[(int)trans_index];            base64[j++] = padding_char;            break;        }    }    base64[j] = '\0';     return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

解码

包括两个函数:

/** 在字符串中查询特定字符位置索引* const char *str ,字符串* char c,要查找的字符*/inline int num_strchr(const char *str, char c) // {    const char *pindex = strchr(str, c);    if (NULL == pindex){        return -1;    }    return pindex - str;}/* 解码* const char * base64 码字* unsigned char * dedata, 解码恢复的数据*/int base64_decode(const char * base64, unsigned char * dedata){    int i = 0, j=0;    int trans[4] = {0,0,0,0};    for (;base64[i]!='\0';i+=4){        // 每四个一组,译码成三个字符        trans[0] = num_strchr(base64char, base64[i]);        trans[1] = num_strchr(base64char, base64[i+1]);        // 1/3        dedata[j++] = ((trans[0] << 2) & 0xfc) | ((trans[1]>>4) & 0x03);        if (base64[i+2] == '='){            continue;        }        else{            trans[2] = num_strchr(base64char, base64[i + 2]);        }        // 2/3        dedata[j++] = ((trans[1] << 4) & 0xf0) | ((trans[2] >> 2) & 0x0f);        if (base64[i + 3] == '='){            continue;        }        else{            trans[3] = num_strchr(base64char, base64[i + 3]);        }        // 3/3        dedata[j++] = ((trans[2] << 6) & 0xc0) | (trans[3] & 0x3f);    }    dedata[j] = '\0';    return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

测试主函数:

// 测试int main(){    const unsigned char str[] = "a45rbcd";    const unsigned char *sourcedata = str ;    char base64[128];    base64_encode(sourcedata, base64);    printf("编码:%s\n",base64);    char dedata[128];    base64_decode(base64, (unsigned char*)dedata);    printf("译码:%s", dedata);    getchar();    getchar();    return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

测试结果:

与网站工具对比: (网站: http://www1.tc711.com/tool/BASE64.htm

more

  1. 算法实现过程很简单,主要是其中移位,拼接的过程容易混乱;
  2. 本篇编码解码都是基于c写的,如果采用c++的话,直接采用bitset,会使位操作变得相当简单,更加易于理解;



















































































    6bits 数 10进制 对应码字
    000000 0 A
    000001 1 B
    011001 25 Z



    011010 26 a
    011011 27 b
    110011 51 z



    110100 52 0
    111101 61 9
    111110 62 +
    111111 63 /
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Bloom filter (C) - LiteratePrograms
编码gb2312,big5,gbk,utf-8识别的最新方法的探讨和c++的实现
LevelDB源码剖析之Varint | 赖明星
huffman编码解码
Base64编码及解码程序源代码
URL encode 与 URL decode 的C语言实现(转)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服