Python 反转字节顺序从网络服务
我从一个网络服务那里得到了以下字节:\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01
这些是8位的数字。我想把它们转换成我系统的表示方式(32位),这样我才能对这些字节进行操作。我该如何用Python来实现这个呢?有没有什么特别的“反转”函数可以用?
最好的问候
5 个回答
1
首先要弄清楚这些字节的顺序是什么样的,然后给struct.unpack
提供正确的字节顺序字符。
1
如果你想把一个字符串里的所有字节反转过来,可以这样做:
'example string'[::-1]
我建议你使用struct模块来处理网络数据或者其他二进制数据,因为如果不使用这个模块,你可能很难知道具体在哪些地方需要反转。这个模块让你可以指定字节的顺序。
1
如果你有8位的数字,字节顺序就不重要,因为每个数字只有一个字节。如果你想把每个字符转换成整数,可以写:
struct.unpack("11B", "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")
或者
struct.unpack("!11B", "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")
或者
map(ord, "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")
这些都是一样的。
如果字符串里包含16位或32位的整数,你可以写类似这样的代码:
struct.unpack("!IIHB", "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")
这段代码会被解读为两个4字节的整数、一个2字节的整数和一个1字节的无符号整数。这里的!
(相当于大端格式的>
)表示字符串是网络字节顺序,所以所有大于一个字节的整数都可以正确转换成你本地的字节顺序。
补充:如果你想得到11个数字并按反向顺序处理它们,你应该使用上面的方法之一,然后调用reversed
,比如:reversed(map(ord, data))
;但这样反转顺序时不管你的本地字节顺序是什么。你没有说明数据到底是什么,所以我不太确定字节顺序在这里是否重要。