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进制数对应的码字如最后的表;

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位,但是高两位都为0const 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;
}

解码

包括两个函数:

/** 在字符串中查询特定字符位置索引
* 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/3dedata[j++] = ((trans[0] << 2) & 0xfc) | ((trans[1]>>4) & 0x03);if (base64[i+2] == '='){continue;}else{trans[2] = num_strchr(base64char, base64[i + 2]);}// 2/3dedata[j++] = ((trans[1] << 4) & 0xf0) | ((trans[2] >> 2) & 0x0f);if (base64[i + 3] == '='){continue;}else{trans[3] = num_strchr(base64char, base64[i + 3]);}// 3/3dedata[j++] = ((trans[2] << 6) & 0xc0) | (trans[3] & 0x3f);}dedata[j] = '\0';return 0;
}

C语言base64编解码相关推荐

  1. 【cue语言系列学习】base64编解码

    [cue语言系列学习]base64编解码 release author: ningan123 release time: 2022-08-14 在线运行 工具 三种不同的输出方式,输出的结果是不一样的 ...

  2. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  3. Java对base64编解码总结

    概述 java对base64编解码的通用处理方法. 关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Bina ...

  4. golang:base64编解码(转)

    转自:golang:base64编解码 Go 语言的标准库自带了 Base64 编码算法,通过几行代码就可以对数据进行编码 编解码字符串 package main import ("enco ...

  5. 通过OpenSSL的接口实现Base64编解码

    对openssl genrsa产生的rsa私钥pem文件,使用普通的base64解码会有问题,如使用https://blog.csdn.net/fengbingchun/article/details ...

  6. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式

    Python PIL.Image和OpenCV图像格式相互转换 二进制打开图片文件,base64编解码转成Opencv格式: # coding: utf-8 import base64 import ...

  7. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  8. Java 8实现BASE64编解码

    Java 8实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用 ...

  9. Notepad++插件Base64编解码

    我们平常进行Base64编码需要自己写代码转换, 或者使用其他人编写的小工具程序, 也可以使用在线base64编码工具, 现在我们还可以使用Notepad++自带的插件, 进行Base64编码和解码, ...

最新文章

  1. OpenGL相关网站
  2. bash shell while语法
  3. Linux文件系统中文版,Linux 文件系统-Go语言中文社区
  4. CODEVS 1408 最长公共子序列
  5. 视屏接口系列(一 ) ----------VGA(对与数信号显示器要加载A/D,延时拖尾、质量下降)...
  6. Random类、String类的一些常用方法
  7. 【数据结构与算法】之深入解析“排列硬币”的求解思路与算法示例
  8. 200730学习日报6字符串
  9. c#通过HttpClient来调用Web Api接口
  10. mysql如何和qt连接使用_Qt5学习:连接MySQL数据库
  11. r语言 list添加_R语言里面双层list变成长形数据框
  12. 【GNN】一份简短入门《图神经网络GNN》笔记小册
  13. Volley 源码解析(一)
  14. love2d教程28--血条
  15. input file选择图片后预览 单图和多图
  16. 【Win11共享打印机,win11家庭版中添加组策略】
  17. 获取HTML页面的所有图片地址
  18. Mybatis-Plus eq、ne、gt、lt、ge、le分别代表含义
  19. 机器学习之梯度提升决策树(GBDT)
  20. 大数据应用常见的6种商业模式

热门文章

  1. 在Linux中创建静态库.a和动态库.so
  2. 求 s=a+aa+ aaa+ aaaa +aaaaa+........的值,a是从键盘输入的,项数也为键盘输入
  3. 动态规划---背包问题分析
  4. 删除rz上传失败乱码的文件
  5. InputStream 、 InputStreamReader和BufferedReader
  6. 学成在线--23.课程图片管理(上传图片)
  7. 产品经理和项目经理有哪些区别?
  8. python基本语句及其意思_Python语法基础(1),一
  9. vb整合多个excel表格到一张_[Excel]同一工作簿中多个工作表保存成独立的表格
  10. python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...