在带有指针的 struct pack Python 中使用大端
Using big endian in struct pack Python with a Pointer
我在 Python 3.7.
中使用结构包
我有这个 header 包含 6 个 uint32 和一个 void * 参数。
我想把它变成二进制格式。不幸的是,我正在处理的界面只支持大 endian.So 我实际上需要转换我发送的内容。
但是由于 P 格式不能修改其字节顺序,所以我总是会遇到结构错误。
那么我该如何重写它以避免出现此错误。
PS:我无法删除 void * 它是我 header
的必填字段
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'
虽然我想要的是:
buffer = b'\x00\x00\x69\x00\x00\x12\x00\x00\x44\x11\x00\x00\x12\x36\x00\x00\x96\x96\x00\x00\x00\x00\x26\x35\x89\x74'
您可能需要分两个阶段执行此操作:
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'
我在 Python 3.7.
中使用结构包
我有这个 header 包含 6 个 uint32 和一个 void * 参数。
我想把它变成二进制格式。不幸的是,我正在处理的界面只支持大 endian.So 我实际上需要转换我发送的内容。 但是由于 P 格式不能修改其字节顺序,所以我总是会遇到结构错误。 那么我该如何重写它以避免出现此错误。
PS:我无法删除 void * 它是我 header
的必填字段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'
虽然我想要的是:
buffer = b'\x00\x00\x69\x00\x00\x12\x00\x00\x44\x11\x00\x00\x12\x36\x00\x00\x96\x96\x00\x00\x00\x00\x26\x35\x89\x74'
您可能需要分两个阶段执行此操作:
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'