python - 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 笔记本——所以不确定这是否重要。
解决方案
字节在那里。但大多数可打印的 ASCII 字符不必用转义码显示。这有助于澄清吗?
>>> hex(b"\x00\x00'\x10"[2])
'0x27'
上面的代码使用 访问字节的第三个元素[2]
,就像一个列表一样,然后使用内置hex()
函数将其呈现为十六进制格式的字符串。这是另一个例子。
>>> b"B"[0]
66
>>> hex(66)
'0x42'
>>> b'\x42'
b'B'
推荐阅读
- androidimageslider - 如何使用 Viewpager 添加幻灯片图像
- javascript - 我如何在反应中包含第三方库(turn.js)
- php - 当我使用 ionic 从 IOS 设备发送数据时,PHP 错误地接收到数据
- angular - 更改 Angular mat-tabs 的顺序
- talend - 如何忽略talend中特定列中包含null的行?
- python - Python遍历两个列表仅遍历最后一个元素
- azure - 带有服务总线触发器的 v2 Azure 函数未触发
- reactjs - 无法在反应组件中设置加载程序
- node.js - 通过 NodeJS 到 127.0.0.1 的 http 请求获得 ECONNREFUSED 的原因可能是什么?
- django - 如何在Django中使用foreignKey链接两个模型,每个模型都有自己的模板