【问题标题】:Using big endian in struct pack Python with a Pointer在带有指针的 struct pack Python 中使用大端
【发布时间】:2019-05-31 08:26:22
【问题描述】:

我在 Python 3.7 中使用 struct pack。
我有这个包含 6 个 uint32 和一个 void * 参数的标头。

我想把它变成二进制格式。不幸的是,我正在处理的接口只支持大端。所以我实际上需要转换我发送的内容。 但是由于 P 格式不能修改它的字节顺序,所以我总是得到 struct 错误。 那么我该如何重写它以避免出现此错误。

PS:我无法删除 void * 它是我的标题的必填字段

u1 = 0x4569 
u2 = 0x1236 
u3 = 0x4411 
u4 = 0x1236 
u5 = 0x9696 
point = 0 #(For now) 
data = 0x26358974 
buffer = struct.pack('5IPI',u1,u2,u3,u4,u5,point,data) 

实际输出

buffer = b'\x69\x45\x00\x00\x36\x12\x00\x00\x11\x44\\x00\x00\x36\x12\x00\x00\x96\x96\\x00\x00\x00\x00\x00\x00\x74\x89\x35\26' 

而我想要的是:

buffer = b'\x00\x00\45\x69\x00\x00\x12\36\x00\x00\x44\x11\x00\x00\x12\x36\\x00\x00\x96\x96\x00\x00\x00\x00\x26\x35\x89\x74'

【问题讨论】:

  • 请用示例输入和所需输出更新问题。
  • 文档说P 仅适用于本机字节排序。
  • u1 = 0x4569 u2 = 0x1236 u3 = 0x4411 u4 = 0x1236 u5 = 0x9696 point = 0 (For now) data = 0x26358974 在当前状态下:buffer = struct.pack('5IPI',u1,u2,u3,u4,u5,point,data) 给我:buffer = b'\x69\x45\x00\x00\x36\x12\x00\x00\x11\x44\\x00\x00\x36\x12\x00\x00\x96\x96\\x00\x00\x00\x00\x00\x00\x74\x89\x35\26' 而我想要的是:buffer = b'\x00\x00\45\x69\x00\x00\x12\36\x00\x00\x44\x11\x00\x00\x12\x36\\x00\x00\x96\x96\x00\x00\x00\x00\x26\x35\x89\x74'

标签: python python-3.x struct endianness pack


【解决方案1】:

您可能需要分两个阶段执行此操作:

u1=1
u2=2
u3=3
u4=4
u5=5
point=6
data=7

# construct two separate buffers
b1 = struct.pack('>5I', u1, u2, u3, u4, u5)
b2 = struct.pack('P', point)

然后将指针转回常规的uint,再转回指针:

p2 = struct.unpack('I', b2)
b2a = struct.pack('>I', p2[0])
b1 = b1 + b2a
print(b1)

输出:

b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06'

【讨论】:

  • 感谢您的帮助。我现在得到这个错误:p2 = struct.unpack('I', b2) struct.error: unpack requires a buffer of 4 bytes
  • 我的 b2b'\x06\x00\x00\x00',它是 4 个字节(当然是小端序)。你有什么?
  • 我的b2b'\x00\x00\x00\x00\x00\x00\x00\x00'。在 python struct officiel 页面中没有标准尺寸,所以也许我需要自己强制尺寸?
  • 听起来您使用的是 64 位系统。打包后这个指针是什么意思?
  • 这是一个保留字段,以防止用户在我的系统中输入不需要的行命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多