下面给出使用 Python 以十六进制形式显示字符串编码(字节序列)的多种方法。
方法1:使用 bytes.hex() (最简单)
python
def show_hex(text: str, encoding='utf-8'):
"""将字符串编码后以十六进制形式显示"""
encoded = text.encode(encoding)
hex_str = encoded.hex() # 连续十六进制字符串
spaced = ' '.join(encoded.hex()[i:i+2] for i in range(0, len(encoded.hex()), 2)) # 空格分隔
print(f"原始字符串: {text}")
print(f"编码方式: {encoding}")
print(f"字节序列: {encoded}")
print(f"十六进制(连续): {hex_str}")
print(f"十六进制(分隔): {spaced}")
# 测试
show_hex("Hello 中国", 'utf-8')
输出示例:
原始字符串: Hello 中国
编码方式: utf-8
字节序列: b'Hello \xe4\xb8\xad\xe5\x9b\xbd'
十六进制(连续): 48656c6c6f20e4b8ade59bbd
十六进制(分隔): 48 65 6c 6c 6f 20 e4 b8 ad e5 9b bd
方法2:使用 binascii.hexlify
python
import binascii
def show_hex_binascii(text: str, encoding='utf-8'):
encoded = text.encode(encoding)
hex_bytes = binascii.hexlify(encoded) # 返回字节对象 b'48656c6c...'
hex_str = hex_bytes.decode('ascii') # 转为字符串
print(f"十六进制: {hex_str}")
show_hex_binascii("Python 3.9", 'gbk')
方法3:手动格式化每个字节
python
def show_hex_manual(text: str, encoding='utf-8'):
encoded = text.encode(encoding)
hex_parts = [f"{b:02x}" for b in encoded] # 每个字节转两位十六进制
print(" ".join(hex_parts))
show_hex_manual("αβγ", 'utf-8')
# 输出: ce b1 ce b2 ce b3 (希腊字母的 UTF-8 编码)
方法4:显示所有支持的编码并对比
python
text = "A€" # 欧元符号
encodings = ['utf-8', 'utf-16', 'gbk', 'latin-1']
for enc in encodings:
try:
encoded = text.encode(enc)
print(f"{enc:8} -> {encoded.hex()}")
except UnicodeEncodeError:
print(f"{enc:8} -> 编码错误")
输出示例:
utf-8 -> 41e282ac
utf-16 -> fffe4100ac20
gbk -> 4180
latin-1 -> 编码错误 (因为 € 不在 Latin-1 范围内)
完整实用函数(带详细注释)
python
def hex_dump_string(s: str, encoding: str = 'utf-8', sep: str = ' ') -> str:
"""
返回字符串编码后的十六进制表示(每个字节两位,可选分隔符)。
参数:
s: 原始字符串
encoding: 编码名称,例如 'utf-8', 'gbk', 'utf-16'
sep: 分隔符,默认空格,使用 '' 表示无分隔符
返回:
十六进制字符串
"""
encoded = s.encode(encoding)
if sep:
return sep.join(f"{b:02x}" for b in encoded)
else:
return encoded.hex()
# 示例
print(hex_dump_string("Hello 世界", 'utf-8')) # 48 65 6c 6c 6f 20 e4 b8 96 e7 95 8c
print(hex_dump_string("Hello 世界", 'utf-8', '')) # 48656c6c6f20e4b896e7958c
print(hex_dump_string("Hello 世界", 'utf-16-be')) # 00 48 00 65 00 6c 00 6c 00 6f 00 20 4e 16 75 4c
注意事项
- 字符串本身不是字节 :Python 字符串是 Unicode 代码点序列,必须通过
.encode()方法转换为特定编码的字节序列后才能看到"十六进制"。 - 不同编码结果不同:同一字符串使用 UTF-8、UTF-16、GBK 等编码会得到完全不同的字节序列。
- 显示格式:通常用空格分隔每个字节的十六进制值,便于阅读;连续十六进制串常用于数据存储或哈希计算。
以上方法可以根据需求选择,最简单且推荐的是 str.encode().hex()。