我使用struct.pack来返回一个字节对象。然而,这是不一致的。
print(struct.pack('BbbB', 0x1B, -2, 1, 0)) #returns b'\x1b\xfe\x01\x00' GOOD
print(struct.pack('BbbB', 0x0F, -2, 1, 0)) #returns b'\x0f\xfe\x01\x00' GOOD
print(struct.pack('BbbB', 0x0C, -2, 1, 0)) #returns b'\x0c\xfe\x01\x00' GOOD
print(struct.pack('BbbB', 0x35, -2, 1, 0)) #returns b'5\xfe\x01\x00' ???
print(struct.pack('BbbB', 0x21, -2, 1, 0)) #returns b'!\xfe\x01\x00' ???如果我看看ASCII字符图,我就会明白为什么它变成了"5“和"!”在最后两个例子中,它不应该返回给我b'\0x35\xfe\x01\x00‘和b'\0x21\xfe\x01\x00’,而不是上面的结果吗?我在这里错过了什么?
我正在使用Python3.7.0。
发布于 2018-08-09 08:27:03
不是包装不一致。是打印功能让你困惑。
都是'!‘(ascii值33,十六进制0x21)和'5‘(ascii值53,十六进制0x35)是可打印字符,因此它们只是正常打印。但是其他字节是不可打印的,因此python需要打印它们的十六进制表示形式,这样您至少可以看到一些有意义的东西。
字节值是您期望的值,不要担心。
发布于 2018-08-09 08:35:14
看一看这个:
>>> b'\x35\xfe\x01\x00'
b'5\xfe\x01\x00'
>>> b'\x35\xfe\x01\x00' == b'5\xfe\x01\x00'
True
>>> b'\x35'
b'5'
>>> b'\x35' == b'5'
True
>>> b'\x35'[0]
53
>>> b'5'[0]
53b'\x35'和b'5'具有相同的字节值0x35。只是它们都是价值相同的两种不同的表示形式。
为同一个实际值编写文字值的方法很多,这是非常常见的。例如,小数值53可以用53、0x35、0o65或0b110101表示。它们都是同一个int对象的数字文本。
就像这样,b'\x35和b'5'只是相同字节对象的两个字节字串文字。
当打印出对象时,Python内部调用对象上的str(),以确保对象是可打印的。对于字节对象,这意味着返回一个字节字符串文本。而且由于表示该对象的方法有多种,因此Python必须决定一种表示形式。
对于字节,规则是,每当字节可以表示为可打印的ASCII字符时,就使用该字符而不是转义序列。这通常允许您读取表示ASCII数据的字节字符串。例如,b'foo'比b'\x66\x6f\x6f'更具可读性(但意味着同样的事情)。
如果需要获得字节对象的一致字符串表示,则可以显式地将其转换为十六进制字符串。例如,通过调用bytes.hex
>>> b'5\xfe\x01\x00'.hex()
'35fe0100'当然,现在这不再是二进制数据,而是表示二进制数据的字符串,编码为十六进制字符串。如果您希望实际传输数据,例如通过网络或在文件中传输数据,您将希望将其保留为bytes对象并只使用该对象。
https://stackoverflow.com/questions/51762032
复制相似问题