为什么 Python 从 to_bytes() 方法返回意外字符?

问题描述 投票:0回答:1

为什么传递给

to_bytes()
方法的一些整数会给出奇怪的结果?

>>> b = 5152
>>> b.to_bytes(2, byteorder='big')
b'\x14 '
>>> b = 5153
>>> b.to_bytes(2, byteorder='big')
b'\x14!'
>>> b = 16592
>>> b.to_bytes(2, byteorder='big')
b'@\xd0'

如何解释

'@'
'!'
' '
?对于 16592,我预计
b'\x40\xd0'

我阅读了 Python 3 文档,其中的所有示例都运行良好:Python 3 to_byte() 描述

>>> b = 1024
>>> b.to_bytes(2, byteorder='big')
b'\x04\x00'

我还尝试了一个这个 Stackoverflow 帖子的示例,它的效果就像一个魅力。

>>> b = 1245427
>>> b.to_bytes(3, byteorder='big')
b'\x13\x00\xf3'

我使用的是Python 3.6.4。

python type-conversion
1个回答
1
投票

如果解释为 ASCII 的字节值是可打印的,则该字节的

repr()
是可打印字符。

由于

@
的 ASCII 值为 0x40,因此这两个值是等价的
b'@'
b'\x40'

通过演示可能比解释更容易看出这一点:

>>> b'\x40'
b'@'

但无论表示形式如何,该对象都是长度为 1 的

bytes
,第一个字节的值为 64:

>>> b'\x40'[0] == 64
True
>>> b'@'[0] == 64
True

回到你的例子,如果你想知道每个字节的十六进制值,你可以使用

bytes.hex()

>>> b=16592
>>> b.to_bytes(2, byteorder='big').hex()
'40d0'
© www.soinside.com 2019 - 2024. All rights reserved.