跳到正文
DevTools / 进制转换器

进制转换器

进制换算本身是算术,难点几乎都在边界情形上:一个 64 位数值只要经过 JavaScript Number 就会丢精度;负数的十六进制形式取决于你假定的字长;一串字节其实是个浮点数。本转换器使用 BigInt 做任意精度运算,128 位数值也能精确往返;支持 2 到 36 的任意进制以及 Base32、Base58、Base62、Base64;并把同一个值按 8、16、32、64 位字长给出有符号与无符号解读,附带位长度、置位数统计与 IEEE-754 重新解释。

完全在浏览器本地运行——不会上传任何内容。

接受 0b、0o、0x 前缀以及下划线、空格分隔符

二进制0b1101 1110 1010 1101 1011 1110 1110 1111
八进制0o33 653 337 357
十进制3 735 928 559
十六进制0xdead beef
Base3232W 353Y
Base361ps9wxb
Base586h8cQN
Base6244pZgF
Base643q 2+7w

位视图

无符号(补码位模式)
3735928559
有符号十进制
该值超出所选字长
位长度
32
字节长度
4
置位数
24
float32
—
float64
1.8457939563e-314
可打印字节
—

把同一段比特按 IEEE-754 重新解释后的结果。

工作原理

位置记数法在任何进制下都是同一套算法:数值等于各位数字乘以该进制的位置次幂之和。从十进制转到其他进制靠反复取商和余数提取各位;转入十进制则靠反复乘加累加。之所以必须用 BigInt 而不是普通数字,是因为 JavaScript 的数字是 IEEE-754 双精度浮点,只能精确表示 53 位整数,因此 64 位数值——例如雪花 ID 或较大的哈希——在解析的那一刻就会静默丢失低位:9007199254740993 会变成 9007199254740992,而这个损坏在数值比对失败之前完全不可见。

负数没有唯一的十六进制表示,字长决定一切。在 32 位补码方案里负一是 FFFFFFFF,同样的值在 64 位下是 FFFFFFFFFFFFFFFF,在 8 位下是 FF。三种都正确,而脱离字长它们都没有意义。这不是理论问题:规定有符号 32 位字段的协议、按 16 位字计算的校验和、以及存储 64 位小端整数的文件格式,各自期待不同的呈现。位宽视图把这一选择显式化,并排显示有符号与无符号读法。

位级解读是把换算工具变成调试工具的关键。位长度告诉你一个值有多少有效位,从而揭示某个标志位是否被置起、某个值是否溢出了预期字段。置位数——值为 1 的比特个数——用于哈希质量检查与纠错码。把同样的 32 位当作 IEEE-754 浮点来读,正是发现寄存器里的 1065353216 其实是 1.0 的方法,这个技巧在逆向二进制格式或排查序列化不一致时反复出现。

基于字母表的编码是另一个家族,之所以一并提供,是因为它们常与数值进制混淆。Base32、Base58、Base62、Base64 编码的是字节串而不是数字,用固定字符集让二进制数据可以安全传输。Base58 尤其去掉了印刷时容易混淆的字符——数字 0、大写 O、大写 I、小写 l——这正是比特币地址使用它的原因,也是从截图里抄下来的 base-58 字符串不容易抄错的原因。它与进制转换唯一的共同点,只是“位置化字母表”这个想法。

常见应用场景

  • 在十六进制颜色、内存地址或位掩码与十进制之间互相转换。
  • 读取日志中的 64 位标识符而不因浮点转换丢失精度。
  • 推算负数在指定字长下的有符号十六进制形式。
  • 把寄存器值解读为 IEEE-754 浮点,以核对序列化格式。
  • 把权限位掩码转成二进制,看清具体哪些位被置起。
  • 为使用紧凑字母表的系统把字节串编码成 Base58 或 Base62。

最后更新: 2026-10-14

常见问题解答

为什么转换大数会得到略有偏差的结果?

因为它经过了 JavaScript 的 Number,而 Number 是 IEEE-754 双精度浮点,只能精确表示到 2^53——约九千万亿——以内的整数。超出之后最低有效位会被舍入掉,数值静默改变。这会影响到雪花 ID、较大的哈希和 64 位数据库键。本转换器全程使用 BigInt,任意大小的值都能精确处理;失真发生在其他工具里,也发生在任何对大字整数调用 parseInt 的代码里。

为什么不同工具给出的负数十六进制不一样?

因为它们假定了不同的字长。补码表示完全取决于宽度:负一在 8 位下是 FF,16 位下是 FFFF,32 位下是 FFFFFFFF,64 位下是 FFFFFFFFFFFFFFFF。全都正确。请选择与你所处理的字段一致的字宽——协议规范或文件格式会写明——并留意那些默默假定 32 位的转换器,当字段实际为 64 位时,它给出的值在构造上就是错的。

怎么判断一个十六进制值是浮点数?

把比特重新解释。IEEE-754 单精度浮点是 32 位:1 位符号、8 位指数、23 位尾数。把整数 1065353216 按浮点读得到 1.0,1078530011 得到约等于圆周率。这在二进制协议或序列化结构存储浮点、而你在看十六进制转储时很重要:一个看起来像任意大整数的值,可能只是一个被重新解释过的普通十进制数。位视图会同时展示同一段 32 位的两种读法。

16 进制和 Base64 有什么区别?

它们是两类不同的东西,只是共用了一些词汇。16 进制是一种数制:它是位置记数法,一个十六进制数表示确切的数量。Base64 是一种字节编码:它把任意字节序列每三个字节映射为四个可打印字符,以便二进制数据通过纯文本通道传输。把数字转成 16 进制保留的是它的值;把字节编码为 Base64 保留的是它的内容。混淆二者,正是“哈希是一个十六进制数”这类说法出现的原因——它实际上是字节串,只是习惯上用十六进制显示。

相关工具