Я пытаюсь преобразовать список целых чисел в массив шортов ctypes. Затем я хочу назначить этот массив полю в BigEndianStructure. Я попытался сделать это:
from ctypes import BigEndianStructure, c_uint16
class Test(BigEndianStructure):
_pack_ = 1
_fields_ = [('arr', c_uint16 * 10)]
num_list = [45, 56, 23]
tester = Test()
short_array = c_uint16 * 10
tester.arr = short_array.from_buffer_copy(bytes(num_list))
Но мне не понравилось, что список оказался меньше ожидаемого:
Traceback (most recent call last):
File "test.py", line 10, in <module>
tester.arr = short_array.from_buffer_copy(bytes(num_list))
ValueError: Buffer size too small (3 instead of at least 20 bytes)
Итак, я попытался расширить список и преобразовать от байтов до старшего байта:
new_list = num_list[:10] + [0]*(10-len(num_list))
buffer = b''
for item in new_list:
buffer += item.to_bytes(2, byteorder='big')
tester.arr = short_array.from_buffer_copy(buffer)
Но он жалуется на то, что буфер не является "be_array", что, как я предполагаю, связано с порядком байтов:
Traceback (most recent call last):
File "test.py", line 14, in <module>
tester.arr = short_array.from_buffer_copy(buffer)
TypeError: incompatible types, c_ushort_Array_10 instance instead of c_ushort_be_Array_10 instance
Я продумывать это? Кто-нибудь есть какие-либо предложения о том, как обойти это?
Редактировать: пояснения из комментариев, соответствующая структура в C имеет uint16_t arr [MAX_LEN], где MAX_LEN = 10. Поэтому я хочу отправить заполненный 0 массив, если переданный массив не полный MAX_LEN.