dehex() 与 Py2/3 兼容
本页合并讲解
dehex反向还原与 myhexdump 的 Python 2/3 兼容策略。
📎 源码在线查看:
myhexdump.py#L210-L224(dehex)
dehex
python
def dehex(hextext):
if PY3K:
return bytes.fromhex(hextext)
else:
hextext = "".join(hextext.split())
return hextext.decode('hex')把十六进制文本还原成二进制。restore() 解析 hex dump 时用。
Py2/3 兼容总策略
python
PY3K = sys.version_info >= (3, 0)这个开关是 myhexdump 全库的版本分流基础——因为 Py2 的 str 就是字节串、Py3 的 str 是 unicode,二者处理方式完全不同。
各处兼容分支
binascii.hexlify 返回类型
python
hexstr = binascii.hexlify(binary)
if PY3K:
hexstr = hexstr.decode('ascii') # Py3 返回 bytes,要变 str 才能 joinbytes.fromhex vs decode('hex')
python
if PY3K:
return bytes.fromhex(hextext) # Py3 内置
else:
return hextext.decode('hex') # Py2 bytes 特有方法Windows stdout 二进制
python
def normalize_py():
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)Windows 的 stdout 默认文本模式,会把 \n 翻译成 \r\n,破坏二进制。msvcrt.setmode 切到二进制模式。Linux/macOS 无此问题。
r0capture 主要在 Linux 跑
normalize_py 对 r0capture 几乎用不到,但作为独立命令行工具(文件末尾 main())在 Windows 下还原二进制时需要。
为什么不用 bytes.hex()
Python 3 的 bytes 对象自带 .hex() 方法,但本库为兼容 Py2 仍用 binascii。