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'
我正在玩 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'