十六进制转文本:ASCII 表、十六进制转储与编程指南
学习如何使用 ASCII 编码将十六进制转换为文本。包含完整的 ASCII 十六进制对照表、如何读取十六进制转储、Python 和 JavaScript 编程示例,以及每位开发者都应掌握的常用十六进制值。
十六进制转文本:ASCII 表、十六进制转储与编程指南
十六进制是底层计算的通用语言。无论是调试网络数据包、读取内存转储、检查文件头,还是处理密码学哈希值,在十六进制与可读文本之间进行转换都是一项必备技能。
本指南涵盖十六进制转文本所需了解的全部内容:ASCII 和 UTF-8 如何将字符映射到十六进制值、如何读取十六进制转储,以及如何在代码中进行转换。你可以使用我们免费的十六进制转文本工具,边阅读边对以下任意示例进行实操验证。
十六进制如何表示文本
计算机将文本存储为字节序列,每个字节的数值介于 0 到 255 之间。十六进制(base-16)提供了一种紧凑的方式来表示这些字节值——每个字节恰好用两位数字(00 到 FF)表示。
从字节到字符的映射由字符编码来定义:
- ASCII:将 0-127 的值映射到英文字母、数字、标点符号和控制字符
- UTF-8:对 ASCII 进行扩展,覆盖所有 Unicode 字符(每种文字、符号和表情符号)
示例:「Hello」的十六进制表示
| 字符 | ASCII 十进制值 | 十六进制值 |
|---|---|---|
| H | 72 | 48 |
| e | 101 | 65 |
| l | 108 | 6C |
| l | 108 | 6C |
| o | 111 | 6F |
因此,「Hello」的十六进制为:48 65 6C 6C 6F
完整 ASCII 十六进制对照表
ASCII 标准定义了 128 个字符(0-127)。以下是全部 95 个可打印字符的十六进制、十进制和二进制值:
数字(0x30-0x39)
| 字符 | 十六进制 | 十进制 | 二进制 |
|---|---|---|---|
| 0 | 30 | 48 | 00110000 |
| 1 | 31 | 49 | 00110001 |
| 2 | 32 | 50 | 00110010 |
| 3 | 33 | 51 | 00110011 |
| 4 | 34 | 52 | 00110100 |
| 5 | 35 | 53 | 00110101 |
| 6 | 36 | 54 | 00110110 |
| 7 | 37 | 55 | 00110111 |
| 8 | 38 | 56 | 00111000 |
| 9 | 39 | 57 | 00111001 |
大写字母(0x41-0x5A)
| 字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 |
|---|---|---|---|---|---|---|---|---|
| A | 41 | 65 | J | 4A | 74 | S | 53 | 83 |
| B | 42 | 66 | K | 4B | 75 | T | 54 | 84 |
| C | 43 | 67 | L | 4C | 76 | U | 55 | 85 |
| D | 44 | 68 | M | 4D | 77 | V | 56 | 86 |
| E | 45 | 69 | N | 4E | 78 | W | 57 | 87 |
| F | 46 | 70 | O | 4F | 79 | X | 58 | 88 |
| G | 47 | 71 | P | 50 | 80 | Y | 59 | 89 |
| H | 48 | 72 | Q | 51 | 81 | Z | 5A | 90 |
| I | 49 | 73 | R | 52 | 82 |
提示:大写字母从 0x41(65)开始,小写字母从 0x61(97)开始,差值恰好是 0x20(32)——翻转 bit 5(从第 0 位起算)即可切换大小写。
小写字母(0x61-0x7A)
| 字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 |
|---|---|---|---|---|---|---|---|---|
| a | 61 | 97 | j | 6A | 106 | s | 73 | 115 |
| b | 62 | 98 | k | 6B | 107 | t | 74 | 116 |
| c | 63 | 99 | l | 6C | 108 | u | 75 | 117 |
| d | 64 | 100 | m | 6D | 109 | v | 76 | 118 |
| e | 65 | 101 | n | 6E | 110 | w | 77 | 119 |
| f | 66 | 102 | o | 6F | 111 | x | 78 | 120 |
| g | 67 | 103 | p | 70 | 112 | y | 79 | 121 |
| h | 68 | 104 | q | 71 | 113 | z | 7A | 122 |
| i | 69 | 105 | r | 72 | 114 |
常用符号(0x20-0x2F、0x3A-0x40、0x5B-0x60、0x7B-0x7E)
| 字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 | 字符 | 十六进制 | 十进制 |
|---|---|---|---|---|---|---|---|---|
| (空格) | 20 | 32 | : | 3A | 58 | [ | 5B | 91 |
| ! | 21 | 33 | ; | 3B | 59 | \ | 5C | 92 |
| " | 22 | 34 | < | 3C | 60 | ] | 5D | 93 |
| # | 23 | 35 | = | 3D | 61 | ^ | 5E | 94 |
| $ | 24 | 36 | > | 3E | 62 | _ | 5F | 95 |
| % | 25 | 37 | ? | 3F | 63 | ` | 60 | 96 |
| & | 26 | 38 | @ | 40 | 64 | { | 7B | 123 |
| ' | 27 | 39 | } | 7D | 125 | |||
| ( | 28 | 40 | ~ | 7E | 126 | |||
| ) | 29 | 41 | ||||||
| * | 2A | 42 | ||||||
| + | 2B | 43 | ||||||
| , | 2C | 44 | ||||||
| - | 2D | 45 | ||||||
| . | 2E | 46 | ||||||
| / | 2F | 47 |
如何读取十六进制转储
十六进制转储以标准化格式展示文件或内存内容,分为三列:
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..|
各列说明
- 偏移量(左列):以十六进制表示的内存地址或文件位置,每行相差 16 字节(0x10)。
- 十六进制字节(中列):16 个字节以十六进制对的形式显示,通常分为两组,每组 8 个。
- ASCII(右列):可打印字符原样显示,不可打印字节用
.表示。
十六进制转储中的常用控制字符
| 十六进制 | 名称 | 含义 |
|---|---|---|
| 00 | NUL | 空字节(C 语言中的字符串终止符) |
| 0A | LF | 换行符(Unix 换行 \n) |
| 0D | CR | 回车符(\r) |
| 0D 0A | CRLF | Windows 换行符(\r\n) |
| 09 | TAB | 水平制表符(\t) |
| 1B | ESC | 转义字符 |
| 7F | DEL | 删除 |
命令行十六进制转储工具
# 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+007F | 1 字节 | 0xxxxxxx | A = 41 |
| U+0080-U+07FF | 2 字节 | 110xxxxx 10xxxxxx | é = C3 A9 |
| U+0800-U+FFFF | 3 字节 | 1110xxxx 10xxxxxx 10xxxxxx | 中 = E4 B8 AD |
| U+10000-U+10FFFF | 4 字节 | 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 FE | UTF-16 LE BOM | UTF-16 文件开头 |
FE FF | UTF-16 BE BOM | UTF-16 文件开头 |
EF BB BF | UTF-8 BOM | UTF-8 文件开头(可选) |
89 50 4E 47 | PNG 文件头 | .png 魔数字节 |
FF D8 FF | JPEG 文件头 | .jpg 魔数字节 |
25 50 44 46 | PDF 文件头(%PDF) | .pdf 魔数字节 |
50 4B 03 04 | ZIP 文件头 | .zip、.docx、.jar 魔数字节 |
7F 45 4C 46 | ELF 文件头 | Linux 可执行文件 |
CA FE BA BE | Java class 文件 | .class 魔数字节 |
DE AD BE EF | 调试标记 | 常见调试/魔术常量 |
00 00 00 00 | 空字节 | 未初始化内存 |
这些位于文件开头的「魔数字节」(文件签名)用于识别文件格式,与文件扩展名无关。
十六进制转文本与十六进制转十进制的区别
这是两种经常被混淆的不同操作:
| 操作 | 输入 | 输出 | 用途 |
|---|---|---|---|
| 十六进制转文本 | 48 65 6C 6C 6F | Hello | 字符编码查询 |
| 十六进制转十进制 | FF | 255 | 数制转换 |
| 十六进制转二进制 | A3 | 10100011 | 数制转换 |
十六进制转文本将每个十六进制对解释为字符编码(ASCII/UTF-8);十六进制转十进制则是将十六进制数字转换为十进制。如需进行数字转换,请使用我们的十六进制转十进制工具;如需二进制转换,请使用我们的十六进制转二进制工具。
常见问题
如何判断一个十六进制字符串是文本还是二进制数据?
查看字节值。如果大部分字节落在可打印 ASCII 范围(0x20-0x7E)内,很可能是文本。如果存在大量超出此范围的值(尤其是 0x00 和 0x80-0xFF),则很可能是二进制数据。十六进制转储工具会在十六进制值旁边显示 ASCII 解释,帮助你在二进制文件中识别文本内容。
为什么有些十六进制字符串以 0x 开头?
0x 前缀是一种编程约定(在 C、Java、Python、JavaScript 中使用),告知编译器或解释器该数字是十六进制而非十进制。它不影响数值本身:十六进制中的 0x41 和 41 表示同一个数字。在将十六进制转换为文本时,处理前需去掉所有 0x 前缀。
大端序与小端序十六进制有什么区别?
字节序影响多字节值(如整数)的字节排列顺序,而不影响单个字节本身。大端序将最高有效字节排在前面(0x00 0x01 = 1),小端序则将最低有效字节排在前面(0x01 0x00 = 1)。文本编码(ASCII/UTF-8)始终从左到右读取,因此字节序不影响十六进制转文本的结果。
准备好转换十六进制了吗?试用我们的十六进制转文本工具,可即时转换并显示逐字符的详细对照表。如需相关转换,还可查看我们的十六进制转二进制工具、十六进制转十进制工具和二进制转换器。