Python 字节十六进制格式中除 0-9 A-F 以外的字符

Characters other than 0-9 A-F in Pythons Bytes Hex Format

我正在玩 MNIST dataset 并想从原始 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

此时我很困惑,所以我google ascii table 来检查单引号撇号字符是什么值。果然是27.

TLDR:为什么 Python 给我一个 0-9 或 A-F 以外的字符来表示字节的十六进制代码?这是错误还是有其他问题?

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

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

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

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

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