Python Ctype для создания разрывов структуры / указателя с массивом char
У меня есть google protobuf сериализованная строка (это сериализованная строка), она содержит текст, MAC-адрес и IP-адрес в байтах. Я пытаюсь сделать структуру переменного тока с этой строкой, используя тип Python C. Если мой mac или ip содержит последовательные нули, он сломает строку, которая будет упакована в структуру. Bytesarray будет заполнен 0.
from ctypes import *
def create_structure(serialized_string):
msg_length = len(serialized_string)
print(serialized_string)
class CommonMessage(Structure):
_pack_ = 1
_fields_ = [("sof", c_uint), ("request_id", c_uint), ("interface", c_uint), ("msg_type", c_uint),
("response", c_uint), ("data_len", c_int), ("data", c_char * msg_length)]
sof = 4293844428
common_msg = CommonMessage(sof, 123456,
11122946,
6000, 0, msg_length,
serialized_string
)
print(bytearray(common_msg))
breaking_string = b'\n&\n\x0f000000000000000\x12\x05durga\x1a\x06\xab\xcd\xef\x00\x00\x00"\x04\x00\x00!\x04\x12\x12000000001111000000\x1a$1c715f33-79dc-4244-9afc-b1669f3cfac2'
create_structure(breaking_string)
Это будет отлично работать, если в массиве char нет последовательных нулей.
1 ответ
ctypes
есть некоторые "полезные" преобразования, которые не помогают в этом случае. Если вы используете c_ubyte
введите для массива, он не будет использовать преобразование. Он не примет байтовую строку в качестве инициализатора, но вы можете создать c_ubyte
массив:
from ctypes import *
def create_structure(serialized_string):
msg_length = len(serialized_string)
print(serialized_string)
class CommonMessage(Structure):
_pack_ = 1
_fields_ = [("sof", c_uint), ("request_id", c_uint), ("interface", c_uint), ("msg_type", c_uint),
("response", c_uint), ("data_len", c_int), ("data", c_ubyte * msg_length)]
sof = 4293844428
common_msg = CommonMessage(sof, 123456,
11122946,
6000, 0, msg_length,
(c_ubyte*msg_length)(*serialized_string)
)
print(bytearray(common_msg))
breaking_string = b'\n&\n\x0f000000000000000\x12\x05durga\x1a\x06\xab\xcd\xef\x00\x00\x00"\x04\x00\x00!\x04\x12\x12000000001111000000\x1a$1c715f33-79dc-4244-9afc-b1669f3cfac2'
create_structure(breaking_string)
Выход:
b'\n&\n\x0f000000000000000\x12\x05durga\x1a\x06\xab\xcd\xef\x00\x00\x00"\x04\x00\x00!\x04\x12\x12000000001111000000\x1a$1c715f33-79dc-4244-9afc-b1669f3cfac2'
bytearray(b'\xcc\xdd\xee\xff@\xe2\x01\x00\x02\xb9\xa9\x00p\x17\x00\x00\x00\x00\x00\x00b\x00\x00\x00\n&\n\x0f000000000000000\x12\x05durga\x1a\x06\xab\xcd\xef\x00\x00\x00"\x04\x00\x00!\x04\x12\x12000000001111000000\x1a$1c715f33-79dc-4244-9afc-b1669f3cfac2')