gpt4 book ai didi

python - 为网络提交转换为 bigendian 的正确方法

转载 作者:行者123 更新时间:2023-12-03 11:56:35 26 4
gpt4 key购买 nike

我需要通过网络获取一个整数。这是转换为大端字节的正确方法吗?

pack("I",socket.htonl(integer_value))

我将其解压为:

socket.ntohl(unpack("I",data)[0])

我注意到 pack-unpack 也有 <> 用于字节序转换,所以我不确定我是否可以直接使用它,或者 htonl 是否更安全。

最佳答案

您应该 struct 模块与另一个系统通信。通过首先使用 htonl,您将以不确定的顺序传输而告终。

由于您需要将整数转换为字节串以便将其发送到另一个系统,因此您需要使用 struct.pack(因为 htonl只是返回一个与作为参数传递的整数不同的整数,你不能直接发送一个整数)。在使用 struct.pack 时,您必须为该字节串选择一个字节序(如果您不指定一个字节序,您将获得一个默认顺序,该顺序在接收端可能不相同,所以你真的需要选择一个)。

将整数转换为确定顺序的字节序列正是 struct.pack("!I", integer_value) 所做的,而确定顺序的字节序列正是您所做的接收端需要

另一方面,如果您使用 struct.pack("!I", socket.htonl(integer_value)),它有什么作用?好吧,首先它将整数放入大端顺序(网络字节顺序),然​​后它采用你已经大端的整数并将其转换为“大端顺序”中的字节。但是,在小端机器上,这实际上会再次颠倒顺序,如果您同时执行这两个操作,您最终将以小端字节顺序传输整数。

但是在大​​端机器上 htonl 是一个空操作,然后你将结果转换为大端顺序的字节。

所以使用 ntohl 实际上 达不到目的 并且接收机器必须知道发送机器上使用的字节顺序才能正确解码它。观察...

小端框:

>>> print(socket.htonl(27))
452984832
>>> print(struct.pack("!I", 27))
b'\x00\x00\x00\x1b'
>>> print(struct.pack("!I", socket.htonl(27)))
b'\x1b\x00\x00\x00'

大端框:

>>> print(socket.htonl(27))
27
>>> print(struct.pack("!I", 27))
b'\x00\x00\x00\x1b'
>>> print(struct.pack("!I", socket.htonl(27)))
b'\x00\x00\x00\x1b'

关于python - 为网络提交转换为 bigendian 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com