Использование big endian в пакете Python с указателем - PullRequest
0 голосов
/ 31 мая 2019

Я использую struct pack в Python 3.7.
У меня есть этот заголовок, содержащий 6 uint32 и один аргумент void *.

Я хочу поместить его в двоичный формат. К сожалению, интерфейс, над которым я работаю, поддерживает только big endian. Поэтому мне нужно преобразовать то, что я посылаю. Но так как формат P не может иметь модифицированного порядка байтов, я всегда получаю структурную ошибку. Так как я могу переписать это, чтобы избежать этой ошибки.

PS: я не могу удалить пустоту * это обязательное поле моего заголовка

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'

1 Ответ

0 голосов
/ 31 мая 2019

Вам может потребоваться сделать это в два этапа:

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'
...