Hex编码详解
最近准备把常用的密码学相关的一些算法都过一遍,先从最简单的 Hex 编码开始吧
在我自己学习的过程中,看过别人的文章,自己也看过源码,发现有些文章的介绍是有问题的
所以我这里会讲的更细致一些,尽量通俗易懂
但我也不会像讲计算机基础那样,细枝末节的知识就略过了
基础
计算机存储数据,大部分时候都是以字节为单位的,我们这里称为 1Byte
但是实际上 1Byte 还可以分的更细,即分为 8 个 bit 位
bit 位应该大家都熟悉了,1bit 只能存储 0 或者 1
那么 8bit 能存储数据的范围就是 0000'0000~1111'1111 ,转换成 10 进制就是 0~255
因为编码的时候只管这 8bit 里的 2 进制值
另外有个地方很多人会混淆的,就是 1Byte 存储数值和存储字符的时候,底层实际的值是不一样的
比如存储数值 1 的时候,1Byte 中的 8 bit 值是 0000'0001
存储字符 "1" 的时候,1Byte 中的 8 bit 值是 0011'0001
Hex 编码
Hex 编码是将数据转换成符合 Intel Hex 文件格式的一种编码方式
Hex 编码的最小单位是 1Byte 也即 8 个 bit 位
算法
- 将 1Byte 分成高 4bit 和低 4bit
- 算出高 4bit 对应的 16 进制数值,这里记为数值 a
- 找出这个数值 a 对应的字符 "a"
- 找出这个字符 "a" 对应的 ascii 码,这个 ascii 码是 8bit 的,也即 1Byte
- 通过相同的方法找出低 8bit 算出来的 ascii 码
- 将上面算出来的 2 个 Byte 拼在一起就得到编码后的 2Byte 数据
特点
- Hex 编码后的数据大小是原来的 2 倍
- 由于算法内部是对 4bit 进行转换,所以编码后的数据从显示上来看是由 0~F 这 16 个字符组成
我们来看两个例子:
Byte 存储实际数值的情况:
假定有 1Byte,里面存放的数值是十进制 226
那么它存储的 8 位二进制值是 1110'0010
高4位是 1110
低4位是 0010
Hex编码的时候,先取高 4 位 1110 转成十六进制的 e ,然后去寻找字符 "e" 对应的 ascii 码,即为 0110'0101
再取低 4 位 0010 转成十六进制的 2 ,然后去寻找字符 "2" 对应的 ascii 码,即为 0011'0010
最终转换后的数据是 0110'0101 0011'0010
按照字符串显示就是 e2
Byte 存储字符的情况:
假定有 1Byte,里面存放的是字符 "g"
那么它存储的 8 位二进制值是 0110'0111
高4位是 0110
低4位是 0111
Hex编码的时候,先取高 4 位 0110 转成十六进制的 6 ,然后去寻找字符 "6" 对应的 ascii 码,即为 0011'0110
再取低 4 位 0111 转成十六进制的 7 ,然后去寻找字符 "7" 对应的 ascii 码,即为 0011'0111
最终转换后的数据是 0011'0110 0011'0111
按照字符串显示就是 67
转载自:https://zhuanlan.zhihu.com/p/446140030
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统