繁体   English   中英

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

[英]Int to Byte conversion not representing in hexadecimal in Python

我在理解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  \

您可以在此处找到转义序列的完整列表及其工作方式。 请注意,在C语言中也有\\0 <-> \\x00

bytes和十六进制表示之间存在差异。 bytes是一种数据类型; 十六进制是一种在屏幕上表示位模式的方法。

bytes是8位值的不可变序列。 解释器在可能的情况下将其显示为字符或字符串转义序列,在不可能的情况下以十六进制显示。 相应的文字称为字节字符串 换句话说,十六进制是一种不得已的方法。 您可以使用十六进制表示法构造bytes 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM