在Python中不以十六进制表示的Int到Byte转换

在Python中不以十六进制表示的Int到Byte转换,python,arrays,byte,Python,Arrays,Byte,我很难理解python是如何在int和byte数据类型之间进行转换的,特别是为什么它与表示为十六进制数不一致 考虑以下情况,其中我将数字13转换为2字节表示: >>> (13).to_bytes(2, byteorder='big') b'\x00\r' 为什么它在第二个字节位置使用字符r 在这种情况下,我希望它输出: b'\x00\xD' 在这两种情况下做相反的操作都会输出正确的答案 >>> int.from_bytes(b'\x00\x0D', byt

我很难理解python是如何在int和byte数据类型之间进行转换的,特别是为什么它与表示为十六进制数不一致

考虑以下情况,其中我将数字13转换为2字节表示:

>>> (13).to_bytes(2, byteorder='big')
b'\x00\r'
为什么它在第二个字节位置使用字符
r

在这种情况下,我希望它输出:

b'\x00\xD'
在这两种情况下做相反的操作都会输出正确的答案

>>> int.from_bytes(b'\x00\x0D', byteorder='big')
13
>>> int.from_bytes(b'\x00\r', byteorder='big')
13
两者都有正确的字节数

>>> len(b'\x00\x0D')
2
>>> len(b'\x00\r')
2

有一些特殊的转义序列非常常见,它们没有用十六进制值显式表示:

\a <-> \x07  alert
\b <-> \x08  backspace
\t <-> \x09  tab (horizontal)
\n <-> \x0A  new line
\v <-> \x0B  vertical tab
\f <-> \x0C  formfeed
\r <-> \x0D  carriage return
\" <-> \x22  "
\' <-> \x27  '
\\ <-> \x5C  \
\a\x07警报
\b\x08退格
\t\x09选项卡(水平)
\n\x0新行
\v\x0B垂直选项卡
\f\x0C格式提要
\r\x0D回车符
\“\x22”
\“\x27”
\\\x5C\
您可以找到一个完整的转义序列列表以及它们的工作方式。
请注意,C语言中也有
\0\x00

字节与十六进制表示之间存在差异<代码>字节是一种数据类型;十六进制是在屏幕上表示位模式的一种方式

字节是8位值的不可变序列。如果可能,解释器将其显示为字符或字符串转义序列,如果不可能,则显示为十六进制。相应的文本称为bytestring。换句话说,十六进制是最后的手段。您可以使用十六进制表示法构造
字节
b'ABC'
b'\x41\x42\x43'
,但解释器仍将其报告为
b'ABC'
。这与处理引号的方式没有什么不同:

>>> a = "ABC"
>>> a
'ABC'
>>> a = 'AB\'C'
>>> a
"AB'C"
解释器有一种显示数据的标准方式,不考虑您最初输入数据的方式。这不是往返失败,因为没有信息丢失。你看到的是一个等价的表示,而不是相同的表示

如果希望看到十六进制表示,那么应该显式地请求它,而不是依赖解释器显示特定数据类型的默认方式

>>> fmt = '\\x{0:02X}\\x{1:02X}'
>>> print(fmt.format(*((13).to_bytes(2, byteorder='big'))))
\x00\0D

从中可以看出,
\r
实际上是
13
,然而,我从未见过它被用在十六进制表示法中。。。在我看来,这似乎是
\0x0D
的一个快捷方式。也许更好的解释是:
字节
类型试图(但失败)在生成其内容表示时“有用”。如果所有原始
int
值都与可打印的ascii对齐,则表示形式将类似于字符串。否则它看起来像转义的十六进制和控制代码。所以我想它们只是默认使用ascii字符来缩短一个字节的打印输出长度?我猜这的主要目的不是真正缩短输出长度,更确切地说,键盘上要敲击的键,或者更可能使字符串更具可读性,这些字符串主要包含文本,但有一些控制字符,主要是
\n
\t
,感谢这些,现在让我更清楚了。以
b'\x41\x42\x43'
为例,实际输出
b'ABC'
。因此,在这种情况下,解释器试图将其显示为一个字符序列,并且可以这样做,因此将其显示为
b'ABC'