首页 > 解决方案 > Pythons Bytes Hex 格式中 0-9 AF 以外的字符

问题描述

我正在使用MNIST 数据集并希望从原始 IDX 格式文件开始。我正在使用 Python 版本3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)]

我以字节形式读取数据:

with open('t10k-images-idx3-ubyte', 'rb') as f:
    data = f.read()

然后开始查看字节,一次四个,并开始将它们与 MNIST 网站上的十六进制签名值进行比较。

data[0:4]
>>> b'\x00\x00\x08\x03'   # (good so far)

data[4:8]
>>> b"\x00\x00'\x10"      # (not sure why there's this single quote / apostrophe character)

我从网站上知道这个值应该是 10000,所以我接下来运行这个代码:

int.from_bytes(data[4:8], 'big')
>>> 10000                 

所以这是正确的值,但是这个的十六进制应该是b"\x00\x27\x10"

我也证明了这一点:

int.from_bytes(b"\x00\x27\x10", 'big')
>>> 10000

在这一点上我很困惑,所以我谷歌了 ascii 表来检查单引号撇号字符是什么值。果然是27

TLDR:为什么 Python 给我一个字符而不是 0-9 或 AF 来表示字节的十六进制代码?这是一个错误还是有其他事情发生?

另外,我也在使用 Jupyter 笔记本——所以不确定这是否重要。

标签: pythonhexbyte

解决方案


字节在那里。但大多数可打印的 ASCII 字符不必用转义码显示。这有助于澄清吗?

>>> hex(b"\x00\x00'\x10"[2])
'0x27'

上面的代码使用 访问字节的第三个元素[2],就像一个列表一样,然后使用内置hex()函数将其呈现为十六进制格式的字符串。这是另一个例子。

>>> b"B"[0]
66
>>> hex(66)
'0x42'
>>> b'\x42'
b'B'

推荐阅读