IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> HEX编码、Base64编码 -> 正文阅读

[C++知识库]HEX编码、Base64编码

摘要

本文将讲述HEXBase64,编码的规则。

HEX编码

hex编码也称之为Base16 编码

就是把一个字节,用十六进制来表示, 表示的结果得是字符形式的。 说过程大家就会更加容易理解

比如说字符的 ‘a’,在计算机底层存储的是 0110 0001 ,对应的16进制就是61 ,它对应的字符 是'61'

也就是说 ‘a’ 经过HEX编码转化成了 '61' ,从计算存储二进制的角度是 从0110 0001经过HEX编码成了 0011011000110001,占用的存储扩大了一倍。

其他任意二进制数据(字节为单位)都可以转化。

代码演示:

byte[] src = "a".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Hex.encode(src);

System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);

输出结果为61

字符串'a'编码后的字符结果:'61'
原长度:1,编码后的长度:2, 编码后是原来的2.00

Base64编码

Base64的算法规则

  • 把数据按照字节分为三个字节一组,也就是24bit,如果最后存在不够三个字节为一组,也就是不够24bit的话,就使用0补位

    • 由于 编码的时候以6bit为一个编码的单位,所以缺一个字节的话就是24-8=16bit,也就是补2bit的0,那么就得补成18bit,构成整数编码单位。
    • 缺两个字节的话就是24-16=8bit,那么就得补成12bit,也就是补4bit的0,构成整数编码单位。
  • 每一组按照 以6bit为单位按照下面表格进行编码。如果最后一组只有三个编码单位的长度,那么就在编码的结果最后加上=,。如果最后一组只有两个编码单位的长度,那么就在编码的结果最后加上==

    ?

    IndexBinaryCharIndexBinaryCharIndexBinaryCharIndexBinaryChar
    0000000A16010000Q32100000g48110000w
    1000001B17010001R33100001h49110001x
    2000010C18010010S34100010i50110010y
    3000011D19010011T35100011j51110011z
    4000100E20010100U36100100k521101000
    5000101F21010101V37100101l531101011
    6000110G22010110W38100110m541101102
    7000111H23010111X39100111n551101113
    8001000I24011000Y40101000o561110004
    9001001J25011001Z41101001p571110015
    10001010K26011010a42101010q581110106
    11001011L27011011b43101011r591110117
    12001100M28011100c44101100s601111008
    13001101N29011101d45101101t611111019
    14001110O30011110e46101110u62111110+
    15001111P31011111f47101111v63111111/
    Padding=

举例说明

  • 最后一组三个字节,不用补位

? 'abc'字符串 底层的二进制为 011000010110001001100011,这是24个bit为一组,以6bit分为四部分为 011000 010110 001001 100011 编码成对应上表的字符 ’ YWJj'

byte[] src = "abc".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Base64.encode(src);

System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);
字符串'abc'编码后的字符结果:'YWJj'
原长度:3,编码后的长度:4, 编码后是原来的1.33
  • 最后一组只有两个字节,补2bit 0

    ? 'ab'字符串 底层的二进制为 0110000101100010,补位成 011000010110001000,以6bit分为三部分为 011000 010110 001000 编码成对应上表的字符 ’ YWI' ,因为比一般的少一个编码单位,所以在后面加上一个=字符,最终的结果就是 ’ YWI='

byte[] src = "ab".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Base64.encode(src);

System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);
字符串'ab'编码后的字符结果:'YWI='
原长度:2,编码后的长度:4, 编码后是原来的2.00
  • 最后一组只有一个字节 补4bit0

    ? 'a'字符串 底层的二进制为 01100001,补位成 011000010000这是24个bit为一组,以6bit分为四部分为 011000 010000 编码成对应上表的字符 ’ YQ' ,因为比一般的少两个编码单位,所以后面加上两个=字符,最终的结果就是 ’ YQ=='

byte[] src = "a".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Base64.encode(src);


System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);
字符串'a'编码后的字符结果:'YQ=='
原长度:1,编码后的长度:4, 编码后是原来的4.00

由于在编码的过程中只有最后一组才有可能存在补位情况,所以我们可以认为 使用base64编码后数据的体积是原来的1.33

总结

? HEX编码的特点是:解码编码速度快但是体积变大了一倍;Base64编码的特点: 体积小,但是由于算法相对复杂所以解码编码速度比较慢。

? 由于两种编码规则可以是任何二进制的数据编码成字符集可以翻译二进制数据,这样的话我们就轻而易举的把二进制数据打印显示出来。便于我们查看二进制数据。有些网络协议传输只支持文本流的二进制数据传输,所以这时候就可以使用这两种编码。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:13:21  更:2022-03-15 22:17:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:59:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码