我正在尝试使用struct.pack()将Integer转换为4字节数组。我虽然得到了一些非常奇怪的结果。
import struct
# Using Big Endian Order
struct.pack('>I', 5000) # works fine
>>>'\x00\x00\x13\x88'
struct.pack('>I', 50000) # has a weird "P" variable which the documentation says shouldn't occur with Endian order.
>>>'\x00\x00\xc3P'
有人可以解释第二个结果发生了什么吗?我期待输出为0x0000C350。
具体来说,我正在尝试通过套接字发送这个字节数组。 e.g。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(IP, PORT)
s.send(Message) # I need this message to be Big Endian, Byte array representation of the number.
我将struct.pack()的结果分配给Message。消息意味着是一个4字节的无符号整数。
答案 0 :(得分:1)
您看到的'P'
只是该特定字节的ascii表示。 'P'
的ascii代码值为80
,以十六进制为0x50
:
>>> ord('P')
80
>>> hex(80)
'0x50'
>>>
Python只是以一种格式显示字节,使其看起来像一个ascii字符串。它确实是一个有效字节数组:
>>> bytearray((0x00, 0x00, 0xc3, 0x50)) == struct.pack(">I", 50000)
True
这就是为什么在将字节字符串转换为十六进制时获得预期值的原因。简而言之,您正在获得正确的价值,您应该可以通过网络原样发送。
答案 1 :(得分:0)
你可以使用他的。
struct.pack('> I',50000).encode(“hex”) '0000c350'
答案 2 :(得分:0)
>>> bary = struct.pack('>I', 50000)
>>> print(len(bary),type(bary))
(4, <type 'str'>)
>>> "\x00\x00\xc3\x50" == bary
True
bary是二进制字符串,你可以在socket上使用它。