Hex 转 ASCII 与回转:面向开发者的 Hex 编码实用指南

发布: (2026年2月6日 GMT+8 01:13)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您想要翻译的具体文本内容(文章正文),我将为您翻译成简体中文并保持原有的格式、代码块和链接不变。

十六进制基础

十六进制(基数‑16)使用符号 0‑9A‑F
每个十六进制位代表 4 位二进制,因此两个十六进制位代表一个字节(8 位)。

十进制十六进制二进制
000000
110001
991001
10A1010
11B1011
12C1100
13D1101
14E1110
15F1111

为什么使用基数‑16?因为计算机以二进制思考,而十六进制与二进制完美对应——每 4 位二进制 = 1 位十六进制。这是最易于人类阅读的二进制数据表示方式。

ASCII 为每个字符分配一个数字(0‑127)。将十六进制转换为 ASCII 就是把这些数字重新映射回它们对应的字符。

十六进制与 ASCII 的相互转换

示例转换

HexDecimalASCII
4872H
65101e
6C108l
6C108l
6F111o

结果: 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
  • 文件签名(魔数)

    格式十六进制签名
    PNG89 50 4E 47 0D 0A 1A 0A
    JPEGFF D8 FF
    PDF25 50 44 46 (%PDF)
    GIF47 49 46 38 (GIF8)
  • 内存地址(例如,来自崩溃转储):

    Segfault at address 0x7FFE4B2A1000
    Stack pointer: 0x00007FFEEFBFF5A0

常用十六进制格式

格式示例典型用途
空格分隔48 65 6C 6C 6F十六进制转储,调试器
无分隔符48656C6C6FURL,哈希
0x 前缀0x48, 0x65C/C++,内存字面量
\x 转义\x48\x65Python,字符串字面量
% 前缀%48%65URL 编码

ASCII 与 扩展/Unicode

EncodingCharacterHex bytes
ASCIIA41
UTF‑8ñC3 B1
UTF‑8E6 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(反之亦然)。

结论

十六进制编码是一项基础技能,在网络调试、二进制分析、颜色代码和编码问题中经常出现。一旦你熟练掌握转换过程,就能在十六进制转储中不假思索地识别模式。

你遇到过最奇怪的十六进制调试情况是什么?在评论中分享吧!

Back to Blog

相关文章

阅读更多 »

QHexView 5.1 发布(以及一点历史)

背景 几乎十年前,我开始编写一个小部件,用于显示我一个已经停摆的旧项目的 binary data。随着时间的推移,我将其代码独立出来并……