Извлеките области структуры C

Я часто должен писать код на других языках, которые взаимодействуют со структурами C. Как правило, это связало написание код Пайтона со структурой или ctypes модулями.

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

Есть ли некоторый инструмент, или библиотека на каком-либо языке (не должен быть C или Пайтон), который может взять.h файл и создать структурированный список его структур и их областей? Я хотел бы иметь возможность написать сценарий, чтобы произвести, мои автоматически производят мои определения структуры в Пайтоне, и я не хочу должным быть обрабатывать произвольный кодекс C, чтобы сделать это. Регулярные выражения работали бы приблизительно 90% отлично времени и затем вызвали бы бесконечные головные боли для остающихся 10%.

14
задан kennytm 12 January 2010 в 16:27
поделиться

6 ответов

Вы не можете добиться независимости от вашего репозитория, если вы ленивы нагрузки от него. Вы можете сохранить его на расстоянии ARM, используя обратный вызов или прокси или позволить Nibernate сделать грязную работу для вас, но ваш DTO должен получить доступ к репозитории для загрузки заметок.

Ваша главная цель, по-видимому, «я хочу, чтобы это было похоже на Поколо к внешней абонеру, поэтому я люблю иметь свойство« заметки », а не методы, такие как« getnotesforProject »на этом или другим классам». Разве вы не можете достичь этого с инъекцией Ninject и Constructor? Как только вы настроите Ninject, вы можете вызвать Kernel.get (), чтобы получить новый экземпляр, который не будет подвергать ссылку на ваш репозиторий.

-121--3815361-

Если вы компилируете свой C-код с отладкой ( -G , Pahole ( Git ) может дать вам точное Используются структурные макеты.

$ pahole /bin/dd
…
struct option {
        const char  *              name;                 /*     0     8 */
        int                        has_arg;              /*     8     4 */

        /* XXX 4 bytes hole, try to pack */

        int *                      flag;                 /*    16     8 */
        int                        val;                  /*    24     4 */

        /* size: 32, cachelines: 1, members: 4 */
        /* sum members: 24, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* last cacheline: 32 bytes */
};
…

Это должно быть довольно приятнее для анализа, чем прямой C.

10
ответ дан 1 December 2019 в 12:38
поделиться

Как заявили другие, держитесь подальше от создания ваших собственных R.Java . Я столкнулся с такой же проблемой, когда я впервые начал с Android, и потребовалось некоторое время, чтобы выяснить, что вызвало ошибками компиляции.

Что вы пытались сделать с помощью файла R.java ?

-121--2249329-

SNPRINTF () - Серьезно, оно того стоит, чтобы иметь возможность сделать безопасные форматированные строки.

-121--833657-

Регулярные выражения будут работать великолепно примерно 90% времени, а затем вызывают бесконечные головные боли для оставшихся 10%.

Головные боли в случаях случаются в тех случаях, когда код C содержит синтаксис, о котором вы не думали при написании ваших регулярных выражений. Затем вы вернетесь назад и понимаете, что C не может быть проанализирован регулярными выражениями, а жизнь становится не веселой.

Попробуйте превратить его вокруг: определите свой собственный простой формат, который позволяет меньше хитрости, чем C, и генерирует как файл заголовка C, и код интерфейса Python из вашего файла:

define socketopts
    int16 port
    int32 ipv4address
    int32 flags

, вы можете легко написать немного Python Это к:

typedef struct {
    short port;
    int ipv4address;
    int flags;
} socketopts;

, а также для излучения класса Python, который использует struct , чтобы упаковать / распаковать три значения (возможно, два из них Big-Endian и другой ни нативно-Endian, до вас).

5
ответ дан 1 December 2019 в 12:38
поделиться

Посмотрите на Swig или SIP, которые сгенерируют код интерфейса для вас или используют -типы .

3
ответ дан 1 December 2019 в 12:38
поделиться

Один мой друг для этой задачи сделал C-Parser, который он использует с COG.

0
ответ дан 1 December 2019 в 12:38
поделиться

Вызов общего статического метода ( create () ) с использованием Character и Integer в качестве аргументов типа. Например, если вы смотрите на Google Java Collections, объявление имеет следующую подпись:

public static <K,V> HashBiMap<K,V> create()

Часть < K, V > сама по себе указывает, что это параметры типа для метода.

Эквивалентный вызов в C # будет одним из:

HashBiMap.Create<Character, Integer>();
HashBiMap<Character, Integer>.Create();

в зависимости от того, хотите ли вы, чтобы он был универсальным методом в нестандартном типе или нестандартным методом в универсальном типе.

Позиционирование параметров типа и аргументов типа в Java является неинтуитивным IMO.

-121--4121355-

Забудьте скрыть его в коде. Это только усложнит чтение, отладку и обслуживание программного обеспечения. Вы также будете прибиты, если ваше программное обеспечение будет проходить проверку безопасности.

Если вы не можете поместить ключ в безопасное место хранения (защищенное на диске, защищенной памяти или парольной фразы в голове), не утруждайте себя ничем другим.

Если вы находитесь в среде * nix, сохранение ключа на диске с разрешениями root/root 400 может быть «достаточно хорошим».

В Windows для хранения данных в защищенной памяти Microsofts можно использовать DPAPI.

Можно также использовать облегченный PBE для шифрования конфиденциального ключа и ввода пользователем парольной фразы при запуске приложения.

-121--3713379-

Вы смотрели на Swig ?

2
ответ дан 1 December 2019 в 12:38
поделиться

Я вполне успешно использовал GCCXML на довольно крупных проектах. Вы получаете XML-представление Code C Code (включая структуры), которые вы можете пост-процесс с помощью нескольких простых Python.

1
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: