Skip to content

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 才能 join

bytes.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。

相关文档 ​

基于 VitePress 构建 · 教学用途