十六进制转十进制:让一个十六进制值变得有意义
这个换算在做什么
它把一个 16 进制值读出来,再用 10 进制复述。十六进制对机器、也对比对位模式的人都很方便,但阈值、字节大小以及任何需要人一眼判断的场合,要的都是十进制。当某个工具丢给你一个值却不再解释时,你需要的就是这个方向。
位权是 16 的幂
从右往左,每一位分别乘以 1、16、256、4096 等等。1E90FF 等于 1 × 16 的五次方加上 14 × 16 的四次方,一路加下去得到 2003199。这个加权求和在每个进制里都一样,变化的只有权值,所以同样的方法在二进制和八进制里照样管用。
十六进制转十进制对照表
调试和网页工作中经常出现的十六进制值及其十进制对应值。值得记住的是那些整十六进制数,它们标出了字节和内存页的边界。
| 十六进制 | 十进制 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| F | 15 |
| 10 | 16 |
| 7F | 127 |
| A5 | 165 |
| FF | 255 |
| 1000 | 4096 |
| FFFF | 65535 |
| DEADBEEF | 3735928559 |
人们实际在解读什么
反复出现的是三件事:读一个颜色通道、把内存地址和某个边界做对照、把截断的哈希变成可比较的数字。颜色最好懂:0x1E90FF 拆开是 30、144 和 255,说明蓝色通道已经饱和而红色很弱。同一套三步读法适用于任何被打包的值,先按字节拆开就会轻松很多。
先拆分,再转换
六位颜色码或很长的地址,按两位一组来读会容易得多,因为每一组就是一个字节。一次性转换整个值只适合要一个答案,先拆分才能看出是哪一个字节反常,而那通常才是你真正想问的问题。
常见问题
怎样手算十六进制转十进制?
把每一位乘以它的位权——从右往左是 1、16、256、4096 等等——再把结果相加。记住 A 是 10、B 是 11,一直到 F 是 15。1E90FF 就是 1048576 + 917504 + 36864 + 0 + 240 + 15,等于 2003199。
为什么内存地址看起来都是很长的一串十六进制?
因为它们天然对齐到字节和字边界,而十六进制的一位正好能和这些边界对上,十进制做不到。两位十六进制是一个字节,所以地址的前几位描述它落在哪一页,后几位描述页内偏移。
可以粘贴带 0x 前缀的值吗?
可以,前缀会被识别并在转换前去掉,所以从调试器或源码里直接复制来的值无需编辑。如果前缀与你所在页面的进制不符,工具会报错而不是悄悄忽略,避免一个被误读的值溜过去。
十六进制值最大能有多大?
六十四位乃至更大。这个范围的顶端已经超出普通浮点运算能精确表示的区间,所以转换使用精确整数运算,每一位都正确,而不是电子表格那种四舍五入后的答案。
把哈希前缀当作数字有意义吗?
算术上有,实用上没有。把哈希的头几个字节转成十进制,对发现规律或写脚本做比较有用,但截断后的哈希已经失去了让它成为哈希的性质,所以不要把十进制形式当成独立的标识符来用。