Hex 编解码:十六进制与字符串在线互转
支持 Hex 转字符串、字符串转 Hex,兼容 ASCII 与 UTF-8 中文,粘贴即转,适用于协议调试、日志与二进制数据分析。
使用方式:
- 字符串转十六进制:原内容贴到左侧,点击「Hex编码」;
- 还原十六进制:编码内容贴到右侧,点击「Hex解码」;
什么是 Hex 编码
Hex(十六进制)编码把每个字节(8 bit)拆成高 4 位和低 4 位,各自映射为 0-9、A-F 中的一个字符,因此 1 个字节固定表示为 2 个十六进制字符。编码后体积是原来的 2 倍,但只含可见字符,便于在日志、配置文件和 URL 中传输与展示二进制数据。
注意区分「十六进制编码」和「十六进制数」:前者是把任意字节序列转成可读文本;后者(如 0xFF)只是数值的一种进制写法,0x 前缀不属于编码内容。
编码与解码原理
- 编码:逐字节取高 4 位、低 4 位,分别查表
0123456789ABCDEF,拼成两个字符。 - 解码:每两个字符一组还原成一个字节,因此 Hex 字符串的长度必须是偶数,否则会报错。
- 例如字节
0xD6(二进制 11010110):高 4 位 1101 对应 D,低 4 位 0110 对应 6,编码结果为D6。
转换示例
| 原始内容 | Hex 编码 |
|---|---|
| Hello | 48656c6c6f |
| 中(UTF-8) | e4b8ad |
| 换行符 \n | 0a |
英文字符按 ASCII 逐字节编码;中文等非 ASCII 字符按 UTF-8 编码为多个字节(常见汉字占 3 个字节),再逐字节转成 Hex。
Go 实现
import "encoding/hex"
hex.EncodeToString([]byte("Hello")) // "48656c6c6f"
hex.DecodeString("48656c6c6f") // []byte("Hello")
Python 实现
"Hello".encode("utf-8").hex() # '48656c6c6f'
bytes.fromhex("48656c6c6f").decode() # 'Hello'
JavaScript 实现
// 编码
Array.from(new TextEncoder().encode("Hello"))
.map(b => b.toString(16).padStart(2, "0")).join("") // "48656c6c6f"
// 解码
new TextDecoder().decode(
new Uint8Array("48656c6c6f".match(/../g).map(h => parseInt(h, 16)))
) // "Hello"
Java 实现
import java.util.HexFormat;
HexFormat.of().formatHex("Hello".getBytes()) // "48656c6c6f"
HexFormat.of().parseHex("48656c6c6f") // byte[] "Hello"
应用场景
- 网络协议与串口调试:把报文原始字节转成可读文本逐字节核对;
- 日志与抓包分析:将不可见的二进制内容转为可打印形式存储和检索;
- 哈希与密钥展示:MD5、SHA 等摘要和密钥通常以 Hex 形式展示。
相关工具:Base64 编解码、URL 编解码
常见问题
- Hex 解码报长度错误?
- Hex 编码每 2 个字符对应 1 个字节,字符个数必须为偶数。请检查是否多复制或漏复制了字符,或混入了空格、
0x前缀。 - 带 0x 前缀的 Hex 能直接解码吗?
- 不能。
0x是编程语言中十六进制字面量的前缀,不属于编码内容,请先去掉再解码。 - Hex 和 Base64 有什么区别?
- 两者都把二进制转成可打印字符。Hex 是 1 字节变 2 字符(体积 ×2),逐字节对应、直观易核对;Base64 体积约 ×1.33 更紧凑,适合大段数据传输。
- 中文转 Hex 为什么变长很多?
- 非 ASCII 字符会先按 UTF-8 编码为多个字节(常见汉字占 3 字节),每个字节再转成 2 个 Hex 字符,所以 1 个汉字通常变成 6 个字符。
试试
68747470733a2f2f7777772e637965616d2e636f6d2f
Feedback