Python教学:十六进制编码的显示方法-由Deepseek产生

下面给出使用 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

注意事项

  1. 字符串本身不是字节 :Python 字符串是 Unicode 代码点序列,必须通过 .encode() 方法转换为特定编码的字节序列后才能看到"十六进制"。
  2. 不同编码结果不同:同一字符串使用 UTF-8、UTF-16、GBK 等编码会得到完全不同的字节序列。
  3. 显示格式:通常用空格分隔每个字节的十六进制值,便于阅读;连续十六进制串常用于数据存储或哈希计算。

以上方法可以根据需求选择,最简单且推荐的是 str.encode().hex()。

相关推荐
懂点Tech5 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
comedate5 小时前
SMLib 的 Examples 导读:PyAPI / SM_API / SMLib 三组示例怎么读
python·cad·smlib·examples·sm_api
微尘hjx5 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
云和数据.ChenGuang5 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
川石课堂软件测试6 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
美狐美颜SDK开放平台6 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq04246 小时前
C++小案例 - 日志实战
开发语言·c++
万化冥合7 小时前
PyBox屏幕键盘如何辅助演示键盘操作?
python·计算机外设
星夜离尘567 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
车软学堂7 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化