转换器

十六进制转文本:ASCII 表、十六进制转储与编程指南

学习如何使用 ASCII 编码将十六进制转换为文本。包含完整的 ASCII 十六进制对照表、如何读取十六进制转储、Python 和 JavaScript 编程示例,以及每位开发者都应掌握的常用十六进制值。

发布于 2026年3月20日
14 分钟阅读
密码学指南

十六进制转文本:ASCII 表、十六进制转储与编程指南

十六进制是底层计算的通用语言。无论是调试网络数据包、读取内存转储、检查文件头,还是处理密码学哈希值,在十六进制与可读文本之间进行转换都是一项必备技能。

本指南涵盖十六进制转文本所需了解的全部内容:ASCII 和 UTF-8 如何将字符映射到十六进制值、如何读取十六进制转储,以及如何在代码中进行转换。你可以使用我们免费的十六进制转文本工具,边阅读边对以下任意示例进行实操验证。

十六进制如何表示文本

计算机将文本存储为字节序列,每个字节的数值介于 0 到 255 之间。十六进制(base-16)提供了一种紧凑的方式来表示这些字节值——每个字节恰好用两位数字(00 到 FF)表示。

从字节到字符的映射由字符编码来定义:

  • ASCII:将 0-127 的值映射到英文字母、数字、标点符号和控制字符
  • UTF-8:对 ASCII 进行扩展,覆盖所有 Unicode 字符(每种文字、符号和表情符号)

示例:「Hello」的十六进制表示

字符ASCII 十进制值十六进制值
H7248
e10165
l1086C
l1086C
o1116F

因此,「Hello」的十六进制为:48 65 6C 6C 6F

完整 ASCII 十六进制对照表

ASCII 标准定义了 128 个字符(0-127)。以下是全部 95 个可打印字符的十六进制、十进制和二进制值:

数字(0x30-0x39)

字符十六进制十进制二进制
0304800110000
1314900110001
2325000110010
3335100110011
4345200110100
5355300110101
6365400110110
7375500110111
8385600111000
9395700111001

大写字母(0x41-0x5A)

字符十六进制十进制字符十六进制十进制字符十六进制十进制
A4165J4A74S5383
B4266K4B75T5484
C4367L4C76U5585
D4468M4D77V5686
E4569N4E78W5787
F4670O4F79X5888
G4771P5080Y5989
H4872Q5181Z5A90
I4973R5282

提示:大写字母从 0x41(65)开始,小写字母从 0x61(97)开始,差值恰好是 0x20(32)——翻转 bit 5(从第 0 位起算)即可切换大小写。

小写字母(0x61-0x7A)

字符十六进制十进制字符十六进制十进制字符十六进制十进制
a6197j6A106s73115
b6298k6B107t74116
c6399l6C108u75117
d64100m6D109v76118
e65101n6E110w77119
f66102o6F111x78120
g67103p70112y79121
h68104q71113z7A122
i69105r72114

常用符号(0x20-0x2F、0x3A-0x40、0x5B-0x60、0x7B-0x7E)

字符十六进制十进制字符十六进制十进制字符十六进制十进制
(空格)2032:3A58[5B91
!2133;3B59\5C92
"2234<3C60]5D93
#2335=3D61^5E94
$2436>3E62_5F95
%2537?3F63`6096
&2638@4064{7B123
'2739}7D125
(2840~7E126
)2941
*2A42
+2B43
,2C44
-2D45
.2E46
/2F47

如何读取十六进制转储

十六进制转储以标准化格式展示文件或内存内容,分为三列:

Offset     Hex bytes                                      ASCII
00000000   48 65 6C 6C 6F 2C 20 57  6F 72 6C 64 21 0A 54 68  |Hello, World!.Th|
00000010   69 73 20 69 73 20 61 20  68 65 78 20 64 75 6D 70  |is is a hex dump|
00000020   20 65 78 61 6D 70 6C 65  2E 0A                    | example..|

各列说明

  1. 偏移量(左列):以十六进制表示的内存地址或文件位置,每行相差 16 字节(0x10)。
  2. 十六进制字节(中列):16 个字节以十六进制对的形式显示,通常分为两组,每组 8 个。
  3. ASCII(右列):可打印字符原样显示,不可打印字节用 . 表示。

十六进制转储中的常用控制字符

十六进制名称含义
00NUL空字节(C 语言中的字符串终止符)
0ALF换行符(Unix 换行 \n
0DCR回车符(\r
0D 0ACRLFWindows 换行符(\r\n
09TAB水平制表符(\t
1BESC转义字符
7FDEL删除

命令行十六进制转储工具

# xxd(最常用,随 vim 附带)
xxd file.bin

# hexdump 规范格式
hexdump -C file.bin

# od(八进制转储,输出十六进制)
od -A x -t x1z file.bin

# Python 单行命令
python3 -c "import sys; [print(f'{i:08x}  {' '.join(f'{b:02x}' for b in chunk)}') for i, chunk in enumerate(iter(lambda: sys.stdin.buffer.read(16), b''), 0)]" < file.bin

UTF-8 多字节字符

ASCII 仅覆盖 128 个字符。对于国际文本、表情符号和特殊符号,UTF-8 每个字符使用 1 到 4 个字节:

Unicode 范围字节数十六进制模式示例
U+0000-U+007F1 字节0xxxxxxxA = 41
U+0080-U+07FF2 字节110xxxxx 10xxxxxxé = C3 A9
U+0800-U+FFFF3 字节1110xxxx 10xxxxxx 10xxxxxx中 = E4 B8 AD
U+10000-U+10FFFF4 字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx😀 = F0 9F 98 80

如何在十六进制中识别 UTF-8

首字节告诉你该字符使用了多少个字节:

  • 00-7F:单字节(ASCII)
  • C0-DF:双字节字符的首字节
  • E0-EF:三字节字符的首字节
  • F0-F7:四字节字符的首字节
  • 80-BF:续字节(不能作为字符的起始字节)

编程中的十六进制转文本

Python

# 十六进制字符串转文本
hex_string = "48 65 6C 6C 6F"
text = bytes.fromhex(hex_string.replace(" ", "")).decode("utf-8")
print(text)  # "Hello"

# 文本转十六进制字符串
text = "Hello"
hex_string = text.encode("utf-8").hex()
print(hex_string)  # "48656c6c6f"

# 字节间带空格
hex_spaced = " ".join(f"{b:02x}" for b in text.encode("utf-8"))
print(hex_spaced)  # "48 65 6c 6c 6f"

JavaScript

// 十六进制字符串转文本
const hexString = "48 65 6C 6C 6F";
const text = hexString.split(" ")
  .map(byte => String.fromCharCode(parseInt(byte, 16)))
  .join("");
console.log(text);  // "Hello"

// 文本转十六进制字符串
const toHex = str => [...str]
  .map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
  .join(" ");
console.log(toHex("Hello"));  // "48 65 6c 6c 6f"

// 使用 TextEncoder 处理正确的 UTF-8
const encoder = new TextEncoder();
const bytes = encoder.encode("Hello 世界");
const hex = [...bytes].map(b => b.toString(16).padStart(2, "0")).join(" ");

命令行

# 文本转十六进制
echo -n "Hello" | xxd -p                    # 48656c6c6f
echo -n "Hello" | od -An -tx1 | tr -d ' \n' # 48656c6c6f

# 十六进制转文本
echo "48656c6c6f" | xxd -r -p               # Hello
printf '\x48\x65\x6c\x6c\x6f'               # Hello

每位开发者都应掌握的常用十六进制值

十六进制含义出现场景
FF FEUTF-16 LE BOMUTF-16 文件开头
FE FFUTF-16 BE BOMUTF-16 文件开头
EF BB BFUTF-8 BOMUTF-8 文件开头(可选)
89 50 4E 47PNG 文件头.png 魔数字节
FF D8 FFJPEG 文件头.jpg 魔数字节
25 50 44 46PDF 文件头(%PDF.pdf 魔数字节
50 4B 03 04ZIP 文件头.zip.docx.jar 魔数字节
7F 45 4C 46ELF 文件头Linux 可执行文件
CA FE BA BEJava class 文件.class 魔数字节
DE AD BE EF调试标记常见调试/魔术常量
00 00 00 00空字节未初始化内存

这些位于文件开头的「魔数字节」(文件签名)用于识别文件格式,与文件扩展名无关。

十六进制转文本与十六进制转十进制的区别

这是两种经常被混淆的不同操作:

操作输入输出用途
十六进制转文本48 65 6C 6C 6FHello字符编码查询
十六进制转十进制FF255数制转换
十六进制转二进制A310100011数制转换

十六进制转文本将每个十六进制对解释为字符编码(ASCII/UTF-8);十六进制转十进制则是将十六进制数字转换为十进制。如需进行数字转换,请使用我们的十六进制转十进制工具;如需二进制转换,请使用我们的十六进制转二进制工具

常见问题

如何判断一个十六进制字符串是文本还是二进制数据?

查看字节值。如果大部分字节落在可打印 ASCII 范围(0x20-0x7E)内,很可能是文本。如果存在大量超出此范围的值(尤其是 0x00 和 0x80-0xFF),则很可能是二进制数据。十六进制转储工具会在十六进制值旁边显示 ASCII 解释,帮助你在二进制文件中识别文本内容。

为什么有些十六进制字符串以 0x 开头?

0x 前缀是一种编程约定(在 C、Java、Python、JavaScript 中使用),告知编译器或解释器该数字是十六进制而非十进制。它不影响数值本身:十六进制中的 0x4141 表示同一个数字。在将十六进制转换为文本时,处理前需去掉所有 0x 前缀。

大端序与小端序十六进制有什么区别?

字节序影响多字节值(如整数)的字节排列顺序,而不影响单个字节本身。大端序将最高有效字节排在前面(0x00 0x01 = 1),小端序则将最低有效字节排在前面(0x01 0x00 = 1)。文本编码(ASCII/UTF-8)始终从左到右读取,因此字节序不影响十六进制转文本的结果。


准备好转换十六进制了吗?试用我们的十六进制转文本工具,可即时转换并显示逐字符的详细对照表。如需相关转换,还可查看我们的十六进制转二进制工具十六进制转十进制工具二进制转换器

关于本文

本文是我们综合 转换器 教程系列的一部分。继续了解古典密码学,并探索我们的交互式密码工具。

更多 转换器 教程

试用 转换器 工具

通过我们的交互式转换器工具,将所学知识付诸实践。

试用 转换器 工具