gpt4 book ai didi

python - Python中字节字面量的比较

转载 作者:太空狗 更新时间:2023-10-29 21:26:35 24 4
gpt4 key购买 nike

出现以下问题是因为我试图使用 bytes 字符串作为字典键,而我理解为相等的字节值并未被视为相等。

为什么以下 Python 代码比较不相等 - 这两个等效表示不是相同二进制数据(故意选择该示例以避免字节顺序)吗?

b'0b11111111' == b'0xff'

我知道以下评估为真,证明了等价性:

int(b'0b11111111', 2) == int(b'0xff', 16)

但为什么 Python 强制我知道表示形式?它与字节序有关吗?除了将它们全部转换为例如十六进制文字之外,是否有一些简单的方法可以强制它们进行等价比较?是否有透明和清晰的方法以(某种程度上)独立于平台的方式在所有表示之间移动(或者我要求太多)?

假设我想以 b'0b11111111' 的形式实际使用 8 位索引字典,那么为什么 Python 将其扩展为 10 个字节,我该如何防止这种情况发生?

这是大型树数据结构的一小部分,将我的索引扩展 80 倍似乎是对内存的巨大浪费。

最佳答案

字节可以表示任意数量的东西。 Python 不能也不会猜测您的字节可能编码的内容。

例如,int(b'0b11111111', 34) 也是一个有效的解释,但该解释不等于十六进制 FF。

解释的数量,其实是无穷无尽的。这些字节可以表示一系列 ASCII 代码点、图像颜色或音符。

除非您明确应用解释,否则 bytes 对象由 0-255 范围内的值序列组成,并且这些字节的文本表示使用 ASCII(如果可以表示为可打印文本):

>>> list(bytes(b'0b11111111'))
[48, 98, 49, 49, 49, 49, 49, 49, 49, 49]
>>> list(bytes(b'0xff'))
[48, 120, 102, 102]

那些字节序列不相等。

如果您想将这些序列显式解释为整数文字,请使用 ast.literal_eval()解释解码文本值;在比较之前总是先归一化:

>>> import ast
>>> ast.literal_eval(b'0b11111111'.decode('utf8'))
255
>>> ast.literal_eval(b'0xff'.decode('utf8'))
255

关于python - Python中字节字面量的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24842764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com