Структура Python ctypes с гибким элементом массива для bytearrayPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Структура Python ctypes с гибким элементом массива для bytearray

Сообщение Anonymous »

Я пишу приложение Python, которое будет записывать двоичный файл. Этот файл будет проанализирован каким-то кодом C, запущенным во встроенной цели.
Я уверен, что смогу сделать это, унаследовав класс Struct, но форматирование упаковки ужасно, и В любом случае вся моя структура имеет прямой порядок байтов, поэтому я подумал об использовании пакета ctypes.
Предположим, у меня есть следующая структура C:

Код: Выделить всё

struct my_c_struct
{
uint32_t    a;
uint16_t    b;
uint16_t    table[];
};
На стороне C я работаю с этой структурой, используя приведение указателя к буферу памяти, поэтому я могу сделать:

Код: Выделить всё

uint8_t buf[128];
// This cast violates strict aliasing rules, see the comments below.
struct my_c_struct *p = (struct my_c_struct*) buf;
p->table[0] = 0xBEEF;
Как лучше всего это представить в Python? Моя первая попытка:

Код: Выделить всё

class MyCStruct(ctypes.LittleEndianStructure):

c_uint32 = ctypes.c_uint32
c_uint16 = ctypes.c_uint16

_pack_ = 1

_fields_ = [
("a", c_uint32),
("b", c_uint16),
]

def __init__(self, a, b):
"""
Constructor
"""
super(ctypes.LittleEndianStructure, self).__init__(a, b)
self.table = []

def pack(self):
data = bytearray(self.table)
return bytearray(self)+data
Идея метода Pack() заключается в том, что он собирает таблицу переменной длины в конце структуры. Имейте в виду, что я не знаю, сколько записей содержит таблица при создании объекта.
То, как я это реализовал, очевидно, не работает. Поэтому я подумал о вложении класса, созданного ctypes, в чистый класс Python:

Код: Выделить всё

class MyCStruct:

class my_c_struct(ctypes.LittleEndianStructure):
_pack_ = 1
_fields_ = [ ("a", ctypes.c_uint32),
("b", ctypes.c_uint16) ]

def __init__(self, a, b):
"""
Constructor
"""
self.c_struct = self.my_c_struct(a,b)
self.table = []

def pack(self):
self.c_struct.b = len(self.table)
x = bytearray(self.c_struct)
y = bytearray()
for v in self._crc_table:
y += struct.pack("

Подробнее здесь: [url]https://stackoverflow.com/questions/63853622/python-ctypes-struct-with-flexible-array-member-to-bytearray[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Структура Python ctypes с гибким элементом массива для bytearray
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Структура Python ctypes с гибким элементом массива для bytearray
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Упаковка ctypes ctypes. Структура внутри класса в Python
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как создать и использовать структуру с помощью стека, заканчивающуюся гибким элементом массива C99 в C ++ без неопределе
    Anonymous » » в форуме C++
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Ctypes в Bytearray
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»