Возврат пакета структуры слишком длинный
Я пытаюсь использовать struct.pack
функция
import struct
values = (0, 44)
s = struct.Struct('HI')
b = s.pack(*values)
print(b)
print(str(len(b)))
и это дает мне такой вывод:
b'\x00\x00\x00\x00,\x00\x00\x00'
8
в то время как документы на Python говорят:
Format - C Type - Python type - Standard size - Notes H - unsigned short - integer - 2 - (3) I - unsigned int - integer - 4 - (3)
так len()
должно быть 2 + 4 = 6, и мне нужны байты с размером = 6
Есть идеи?
Я использую Python 3.6 на Windows 10
3 ответа
pack
добавит байты пэда, чтобы второе целое число было выровнено на 4 байта. Из документации:
По умолчанию, результат упаковки данной структуры C включает байты заполнения, чтобы обеспечить правильное выравнивание для задействованных типов C; Чтобы... пропустить неявные байты пэда, используйте стандартный размер и выравнивание вместо собственного размера и выравнивания: см. Порядок байтов, Размер и Выравнивание для деталей
Это является следствием "заполнения структуры данных". Это будет дополнять H
(2 байта + заполнение 2 байта), чтобы он выровнялся с I
(4 байта).
Однако вы можете поэкспериментировать с заказом, если вам нужно уменьшить размер. Цитировать Википедию:
Можно изменить выравнивание структур, чтобы уменьшить объем необходимой им памяти (или соответствовать существующему формату), переупорядочив элементы структуры или изменив выравнивание (или "упаковку") компилятора элементов структуры.
Например, на моем компьютере это работает, если вы просто меняете H
а также I
:
import struct
values = (0, 1)
s = struct.Struct('IH') # swapped H and I
b = s.pack(*values)
print(b) # b'\x00\x00\x00\x00\x01\x00'
print(str(len(b))) # 6
print(struct.calcsize('IH')) # 6
print(struct.calcsize('HI')) # 8
Вычисление размера не является непосредственно аддитивным для содержащихся нативных типов. Вы должны рассчитать размер, используя struct.calcsize
:
In [8]: struct.calcsize('HI')
Out[8]: 8