Python3如何将ASCII十六进制形式的字节描述字符串转换为实际字节
Python3 十六进制字面量字符串转字节对象方法
问题场景
需要将仅由ASCII十六进制字符(0-9、a-f、A-F)组成、用于描述字节值的字面量字符串,转换为对应的真实字节对象,不能直接按ASCII编码规则对字符串本身做编码。典型场景为PDF内容提取:
待转换的纯十六进制字符串示例:
00180012001a001b...
从PDF内容流中提取的典型原始数据结构如下:
# PDF原始文本片段 original = '[ <00010002> 1 <000300040005> 1.00708 <00060007> ] TJ' # 提取尖括号内的内容拼接得到的纯十六进制串 parsed = '0001000200030004000500060007' # 错误做法:会把每个十六进制字符本身按ASCII编码,得不到目标字节 bparsed_wrong = parsed.encode('ascii')
这类字符串天然可按每2个字符对应1个字节、每4个字符对应1个16位单元的规则拆分,转换完成后可进一步匹配对应编码(如PDF常用的WinAnsiEncoding)完成解码。
原生实现方案
直接使用Python3内置的bytes.fromhex()类方法即可,该方法是标准库原生提供的实现,简洁鲁棒,无第三方依赖:
parsed = '0001000200030004000500060007' # 核心转换逻辑 bparsed = bytes.fromhex(parsed) # 转换结果验证 print(bparsed) # 输出:b'\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07'
方法特性说明
- 自动忽略输入字符串中的所有空白字符(空格、换行、制表符等),如果提取的十六进制串存在多余空白,无需提前做清洗处理
- 输入字符串长度必须为偶数,否则会抛出
ValueError,如果遇到长度为奇数的串,需要检查提取逻辑是否存在字符遗漏,或按需补前导0 - 转换得到的字节对象是真实的字节值序列,后续可直接尝试对应编码做解码。注意:不建议用chardet识别这类PDF片段的编码,PDF文本编码通常和字体对象的编码标识绑定,chardet对多编码混合的短字节串识别准确率极低。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

