Python 反转字节顺序从网络服务

1 投票
5 回答
1965 浏览
提问于 2025-04-16 22:36

我从一个网络服务那里得到了以下字节:\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));但这样反转顺序时不管你的本地字节顺序是什么。你没有说明数据到底是什么,所以我不太确定字节顺序在这里是否重要。

撰写回答