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 编码
Hello48656c6c6f
中(UTF-8)e4b8ad
换行符 \n0a

英文字符按 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