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

时间:2018-04-06 07:42:48

标签: 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', byteorder='big')
13
>>> int.from_bytes(b'\x00\r', byteorder='big')
13

两者都有正确的字节数

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

2 个答案:

答案 0 :(得分:0)

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

Set<Element> treeSet = new TreeSet<>((Element element1, Element element2) -> String.valueOf(element1.data).compareTo(String.valueOf(element2.data)));

您可以找到转义序列的完整列表及其工作方式here。 请注意,C语言中也有\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 \

答案 1 :(得分:0)

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