首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python struct.pack不一致。

Python struct.pack不一致。
EN

Stack Overflow用户
提问于 2018-08-09 08:17:12
回答 2查看 678关注 0票数 0

我使用struct.pack来返回一个字节对象。然而,这是不一致的。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-09 08:27:03

不是包装不一致。是打印功能让你困惑。

都是'!‘(ascii值33,十六进制0x21)和'5‘(ascii值53,十六进制0x35)是可打印字符,因此它们只是正常打印。但是其他字节是不可打印的,因此python需要打印它们的十六进制表示形式,这样您至少可以看到一些有意义的东西。

字节值是您期望的值,不要担心。

票数 1
EN

Stack Overflow用户

发布于 2018-08-09 08:35:14

看一看这个:

代码语言:javascript
复制
>>> 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]
53

b'\x35'b'5'具有相同的字节值0x35。只是它们都是价值相同的两种不同的表示形式。

为同一个实际值编写文字值的方法很多,这是非常常见的。例如,小数值53可以用530x350o650b110101表示。它们都是同一个int对象的数字文本。

就像这样,b'\x35b'5'只是相同字节对象的两个字节字串文字。

当打印出对象时,Python内部调用对象上的str(),以确保对象是可打印的。对于字节对象,这意味着返回一个字节字符串文本。而且由于表示该对象的方法有多种,因此Python必须决定一种表示形式。

对于字节,规则是,每当字节可以表示为可打印的ASCII字符时,就使用该字符而不是转义序列。这通常允许您读取表示ASCII数据的字节字符串。例如,b'foo'b'\x66\x6f\x6f'更具可读性(但意味着同样的事情)。

如果需要获得字节对象的一致字符串表示,则可以显式地将其转换为十六进制字符串。例如,通过调用bytes.hex

代码语言:javascript
复制
>>> b'5\xfe\x01\x00'.hex()
'35fe0100'

当然,现在这不再是二进制数据,而是表示二进制数据的字符串,编码为十六进制字符串。如果您希望实际传输数据,例如通过网络或在文件中传输数据,您将希望将其保留为bytes对象并只使用该对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51762032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档