Struct.Pack无符号整数有时不使用4个字节

时间:2014-09-17 04:19:43

标签: python

我正在尝试使用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字节的无符号整数。

3 个答案:

答案 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上使用它。