Hex 转 ASCII 与回转:面向开发者的 Hex 编码实用指南
Source: Dev.to
请提供您想要翻译的具体文本内容(文章正文),我将为您翻译成简体中文并保持原有的格式、代码块和链接不变。
十六进制基础
十六进制(基数‑16)使用符号 0‑9 和 A‑F。
每个十六进制位代表 4 位二进制,因此两个十六进制位代表一个字节(8 位)。
| 十进制 | 十六进制 | 二进制 |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| … | … | … |
| 9 | 9 | 1001 |
| 10 | A | 1010 |
| 11 | B | 1011 |
| 12 | C | 1100 |
| 13 | D | 1101 |
| 14 | E | 1110 |
| 15 | F | 1111 |
为什么使用基数‑16?因为计算机以二进制思考,而十六进制与二进制完美对应——每 4 位二进制 = 1 位十六进制。这是最易于人类阅读的二进制数据表示方式。
ASCII 为每个字符分配一个数字(0‑127)。将十六进制转换为 ASCII 就是把这些数字重新映射回它们对应的字符。
十六进制与 ASCII 的相互转换
示例转换
| Hex | Decimal | ASCII |
|---|---|---|
| 48 | 72 | H |
| 65 | 101 | e |
| 6C | 108 | l |
| 6C | 108 | l |
| 6F | 111 | o |
结果: Hello 👋
反向转换同样简单:
"Dev" → D(44) e(65) v(76) → 44 65 76
JavaScript
// Hex → ASCII
function hexToAscii(hex) {
return hex
.match(/.{1,2}/g)
.map(byte => String.fromCharCode(parseInt(byte, 16)))
.join('');
}
// ASCII → Hex
function asciiToHex(str) {
return Array.from(str)
.map(char => char.charCodeAt(0).toString(16).padStart(2, '0'))
.join(' ');
}
console.log(hexToAscii('48656C6C6F')); // "Hello"
console.log(asciiToHex('Hello')); // "48 65 6c 6c 6f"
Python
# Hex → ASCII
def hex_to_ascii(hex_string):
return bytes.fromhex(hex_string).decode('ascii')
# ASCII → Hex
def ascii_to_hex(text):
return ' '.join(f'{ord(c):02x}' for c in text)
print(hex_to_ascii('48656C6C6F')) # "Hello"
print(ascii_to_hex('Hello')) # "48 65 6c 6c 6f"
Bash (using xxd and od)
# Hex → ASCII
echo '48656C6C6F' | xxd -r -p
# Output: Hello
# ASCII → Hex (continuous)
echo -n 'Hello' | xxd -p
# Output: 48656c6c6f
# ASCII → Hex (pretty, space‑separated)
echo -n 'Hello' | od -A n -t x1
# Output: 48 65 6c 6c 6f
实际应用
-
数据包捕获 (Wireshark, tcpdump) 显示十六进制负载。在转储中发现 ASCII 文本是基本的调试技能:
0000 47 45 54 20 2f 61 70 69 GET /api 0008 2f 75 73 65 72 73 20 48 /users H 0010 54 54 50 2f 31 2e 31 TTP/1.1 -
网页颜色 是十六进制值:
color: #FF5733; /* R:255 G:87 B:51 */ background: #2D2D2D; /* Dark gray */ -
UTF‑8 编码 示例:
字符 UTF‑8 十六进制 é C3 A9 € E2 82 AC 🔥 F0 9F 94 A5 -
文件签名(魔数):
格式 十六进制签名 PNG 89 50 4E 47 0D 0A 1A 0A JPEG FF D8 FF PDF 25 50 44 46 ( %PDF)GIF 47 49 46 38 ( GIF8) -
内存地址(例如,来自崩溃转储):
Segfault at address 0x7FFE4B2A1000 Stack pointer: 0x00007FFEEFBFF5A0
常用十六进制格式
| 格式 | 示例 | 典型用途 |
|---|---|---|
| 空格分隔 | 48 65 6C 6C 6F | 十六进制转储,调试器 |
| 无分隔符 | 48656C6C6F | URL,哈希 |
0x 前缀 | 0x48, 0x65 | C/C++,内存字面量 |
\x 转义 | \x48\x65 | Python,字符串字面量 |
% 前缀 | %48%65 | URL 编码 |
ASCII 与 扩展/Unicode
| Encoding | Character | Hex bytes |
|---|---|---|
| ASCII | A | 41 |
| UTF‑8 | ñ | C3 B1 |
| UTF‑8 | 漢 | E6 BC A2 |
| UTF‑8 | 🚀 | F0 9F 9A 80 |
ASCII 只覆盖 0‑127(7 位)。128‑255 的值属于“扩展 ASCII”(取决于代码页)。现代文本使用 Unicode,使用 UTF‑8 编码,如上所示。
Pro Tip
小写字母从 0x61 开始,大写字母从 0x41 开始。它们之间的差始终是 0x20(32)。因此,切换大小写只需翻转一位。
实用工具
对于快速的、无需注册或追踪的浏览器内转换,请尝试 hextoascii.co – 粘贴十六进制,获取 ASCII(反之亦然)。
结论
十六进制编码是一项基础技能,在网络调试、二进制分析、颜色代码和编码问题中经常出现。一旦你熟练掌握转换过程,就能在十六进制转储中不假思索地识别模式。
你遇到过最奇怪的十六进制调试情况是什么?在评论中分享吧!