文章目录

  • base16、base32和base64,转码原理
    • 基本概念
    • 基于base16编解码源码介绍
    • Base-64编码
      • Encoding VS. Encryption
      • 作用及原理
    • 索引表
      • base64索引表:
      • base32索引表:
      • base16索引表:
    • 转码原理
      • 转码
      • base64填充
      • 示例:

base16、base32和base64,转码原理

基本概念

ASCII 是用128(2的8次方)个字符,对二进制数据进行编码的方式
base64编码是用64(2的6次方)个字符,对二进制数据进行编码的方式
base32就是用32(2的5次方)个字符,对二进制数据进行编码的方式
base16就是用16(2的4次方)个字符,对二进制数据进行编码的方式

基于base16编解码源码介绍

就是把二进制数据转成16进制,显示16进制的值就可以了
16进制一个字符是4位,正常一个字节是8位,切一半就转成16进制了。
所以,base16转码后空间扩大一倍,4位转成一个字符, 1个字节转成两个字符

#include <iostream>
using namespace std;
static const char BASE16_ENC_TAB[] = "0123456789ABCDEF";
//  '0' ~'9' =>  48~57  'A'~'F' = > 65~70
static const char BASE16_DEC_TAB[128] = {-1,                                 //0-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,      //1-10-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,      //11-20-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,      //21-30-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,      //31-40-1,-1,-1,-1,-1, -1,-1, 0, 1, 2,      //41-503, 4, 5, 6 ,7,  8, 9, -1,-1,-1,      //51-60-1,-1,-1,-1,10, 11,12,13,14,15      //61-70 'A'~'F'
};int Base16Encode(const unsigned char* in, int size, char* out)
{for (int i = 0; i < size; i++){//一个字节取出高4位和低4位  1000 0001  0000 1000char h = in[i] >> 4;   //移位丢弃低位,右移4位  (0~15)char l = in[i] & 0x0F; // 0000 1111 去掉高位 (0~15)out[i * 2] = BASE16_ENC_TAB[h]; //(0~15) 映射到对应字符out[i * 2 + 1] = BASE16_ENC_TAB[l];}//base16 转码后空间扩大一倍 4位转成一个字符 1个字节转成两个字符return size * 2;
}int Base16Decode(const string &in, unsigned char* out)
{//讲两个字符拼成一个字节  B2E2CAD442617365313600for (int i = 0; i < in.size(); i += 2){unsigned char ch = (int)in[i];           //高位转换的字符 'B'=>66 :10unsigned char cl = (int)in[i + 1];       //低位转换的字符 '2'=>50 :2unsigned char h = BASE16_DEC_TAB[ch];   //转换成原来的值unsigned char l = BASE16_DEC_TAB[cl];// 两个4位拼成一个字节(8位)///  1000  >>4    1000 0000//   0001         0000 0001//               |1000 0001out[i / 2] = (int)(h << 4 | l);}return in.size() / 2;
}int main(int argc,char *argv[])
{cout << "Test Base16" << endl;const unsigned char data[] = "测试Base16";int len = sizeof(data);char out1[1024] = { 0 };unsigned char out2[1024] = { 0 };cout << data << endl;int re = Base16Encode(data, len, out1);cout << re << ":" << out1 << endl;re = Base16Decode(out1, out2);cout << re << ":" << (char*)out2 << endl;return 0;
}

输出结果

解码的时候’b’字符转换成ASCII码值位66,所以66位改为10的值。

Base-64编码

Encoding VS. Encryption

很多人都以为编码(Encoding)和加密(Encryption)是同一个意思。编码和加密都是对格式的一种转换,但是它们是有区别的。编码是 公开的,比如下面要介绍的Base 64编码,任何人都可以解码;而加密则相反,你只希望自己或者特定的人才可以对内容进行解密。

作用及原理

Base 64 Encoding有什么用?举个简单的例子,你使用SMTP协议 (Simple Mail Transfer Protocol 简单邮件传输协议)来发送邮件。因为这个协议是基于文本的协议,所以如果邮件中包含一幅图片,我们知道图片的存储格式是二进制数据(binary data),而非文本格式,我们必须将二进制的数据编码成文本格式,这时候Base 64 Encoding就派上用场了。

Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。

而且base64特别适合在http,mime协议下快速传输数据。

base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

X.509公钥证书也好,电子邮件数据也好,经常要用到Base64编码,那么为什么要作一下这样的编码呢?
我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

如一个xml当中包含另一个xml数据,此时如果将xml数据直接写入显然不合适,将xml进行适当编码存入较为方便,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,那么怎么办呢?
可以使用base64进行编码,然后存入xml,解码反之
其实还有个办法,将byte的值写在xml当中,空格或者,分开,这样也可以将byte数据传入,不过这样更浪费空间,并且不易保存.

另一个,比如http协议当中的key value字段,必须进行URLEncode 不然出现的等号可能使解析失败 空格也会使http请求解析出现问题,比如 请求行就是以空格来划分的 POST /guowuxin/hehe HTTP/1.1

又比如有些文本协议不支持不可见字符的传递,只能用大于32的可见字符来传递信息(协议规定)

索引表

base64索引表:

base32索引表:

base16索引表:

转码原理

转码

这里只介绍Base-64转码,其他的原理一样
2的6次方即为64
Base-64编码将一个8位子节序列拆散为6位的片段,并为每6位分配一个字符(见索引表)。这64个字符都是很常见的,可以安全地放在HTTP首部字段中。这64个字符中包括大小写字母、数字、+和/,特殊字符=(即结尾处使用的=号)

示例:

在结尾还差的补等于号。

上面的三个字符“Man”是原文,下面的四个字符“TWFu”是Base64编码后的字符

经过base64编码后,字符串理论上比之前长1/3,也就是原来的4/3。(除下面两种情况外)。

base64填充

base64编码收到一个8bit字节数据,将这个二进制序列每6bit划分一个块。二进制序列有时不能正好平均地分为6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数)。

  • 6bit里面的数据,全部是填充的,它显示的符号是第65个符号”=”。
  • 6bit里面的数据,部分是填充的,按照索引表正常显示

示例:

输入字符串为”a:a”为3个字节(24位)。24是24的倍数,因此按照上面给出的例子计算。无需填充就会得到base64编码为”YTph”。

输入字符串变为”a:aa”为4个字节(32位)。要凑为24的倍数,最小的值是48。因此要添加16个填充码。

a:a – 011000 010011 101001 100001 – YTph
a:aa – 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx – YTphYQ==
a:aaa – 011000 010011 101001 100001 011000 010110 0001xx xxxxxx – YTphYWE=
a:aaaa – 011000 010011 101001 100001 011000 010110 000101 1000001 – YTphYWFh

base16、base32和base64转码原理相关推荐

  1. python:Base16, Base32, Base64, Base85 数据编码

    python:Base16, Base32, Base64, Base85 数据编码 此模块提供了将二进制数据编码为可打印的 ASCII 字符以及将这种编码格式解码回二进制数据的函数. 它为 RFC ...

  2. Base64编解码原理并用Java手工实现Base64编解码

    Base64编解码原理 目前Base64已经成为网络上常见的传输8比特字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后进行签名或加密,之后再次Bas ...

  3. Base64与Java -- Base64简介与原理

    Base64与Java – Base64简介与原理 文章目录 Base64与Java -- Base64简介与原理 简介与用途 为什么叫Base64? 编码流程 常规处理 特殊处理 剩余1个字节 剩余 ...

  4. Python Base64转码解码

    Python Base64 提供了好几种方法例如: encode, decode, encodestring, decodestring, b64encode, b64decode, standard ...

  5. Android数据传输加密(一):Base64转码算法

    前言:本文重点在第4部分,Android中Base64算法的使用,主要是介绍android.util.Base64类,其他为对Base64原理的讲解,不关心原理的小伙伴,可直接阅读第4部分 1.何为B ...

  6. 详述图片base64加密的原理,告诉你什么是“/9j/“

        欢迎大家搜索"小猴子的技术笔记"关注我的公众号,有问题可以及时和我交流.     在日常的生活中,我们肯定都经历过类似这样的场景:报名考试上传图片,网站要求的是上传的照片不 ...

  7. 关于base64转码

    一.计算机开始之初,Hex Hex的编码原理是:把一长串二进制数每4个分一组,如果位数不够就在高位补0.4位数字一共只有16种情况,分别用0-9,A-F表示这16种情况. 二.ASCII码 美国信息交 ...

  8. 16进制转Base64的实现原理及代码

    随着计算机技术的发展,数据的存储和传输方式也在不断更新,其中十六进制字符串和Base64编码是两种常见的数据表示方式.本文将介绍16进制字符串和Base64编码的原理,并提供Java代码实现16进制字 ...

  9. 彻底搞懂base64加解密原理和隐写技术

    base64编码和解码是一个常用的方式,可以避免明文传输或者存储,也可以结合加解密技术进行使用. base64 编码的定义:base64编码表: base64 采用6位二进制进行编码,不足部分补足0, ...

  10. base64转码java版

    base64转码java版 package com.net.util;import java.io.FileInputStream; import java.io.FileOutputStream; ...

最新文章

  1. 设计模式之桥接模式(Bridge)摘录
  2. 10行代码-原生JS双向数据绑定演示
  3. 三星 Nexus S刷MIUI ROM最新图文刷机教程
  4. ELK学习1_开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索
  5. 【汇编语言】——第三章课后总结
  6. abp模块生命周期设计思路剖析
  7. 基础省选+NOI 第9部分 网络流
  8. python是脚本语言_Python 脚本语言
  9. oracle procedure可以执行非常复杂的语句吗,oracle-存储过程(procedure)
  10. 使用Apache commons-pool2实现高效的FTPClient连接池的方法
  11. 伟大时刻:小米的命门
  12. 【电场】基于模拟电荷法计算输电线路铁塔周围电场分布附matlab代码
  13. 简单的 thymeleaf 前端网页模板
  14. google code的使用方法
  15. 18 获取给定的序列的所有排列, 组合
  16. C++求最大公约数 两种方法
  17. cesium加载wms、wmts、tms、wfs服务
  18. 九校联考-长沙市一中NOIP模拟Day2T2 走格子(cell)
  19. 第二行代码学习总结 我遇到的BUG汇总
  20. 《asp.net夜话》一书视频ASP.NET夜话视频1-14章下载(ASP.NET夜话2009年5月8日更新)

热门文章

  1. 社交网络分析中重要指标说明
  2. 【采用】社交网络分析与金融反欺诈应用(知识图谱?)
  3. css修改图标字体大小,css-更改AngularJS材质图标的图标大小
  4. CVPR 2022 | AAAI2022 | WACV 2022 超分辨率(super-resolution)方向上接收论文总结
  5. javascript 验证 国际格式 电话号码
  6. 2021年文件复制软件评测:FastCopy、TeraCopy、KillCopy、ExtremeCopy、Supercopier
  7. 观察者模式及其应用场景
  8. 【图像分割】基于matlab最大类间方差法(otsu)图像分割【含Matlab源码 121期】
  9. python矩阵乘法代码_python3 单行代码实现矩阵相乘
  10. python爬虫:抓取某易云音乐歌曲歌词