Разбор данных с заголовочными файлами C, которые определили структуры - PullRequest
1 голос
/ 20 февраля 2012

У меня есть такой заголовочный файл C:

#define NAME_LEN 8
#define DEV_MAX  4

typedef struct __device
{
    int iDevID;
    int iDevSN;
}DEVICE;

typedef struct __person
{
    int iID;
    char acName[NAME_LEN];
    DEVICE aDevices[DEV_MAX];
}PERSON;

и файл двоичных данных может выглядеть так:

0000000 01 00 08 00 4a 61 63 6b 00 00 00 00 0a 00 00 00
0000020 11 11 11 11 0b 00 00 00 22 22 22 22 0c 00 00 00
0000040 33 33 33 33 0d 00 00 00 44 44 44 44

Все, что мне нужно, это визуализированное представление данных с именами полей с использованием файла заголовка C выше .... Так будет лучше ...

m--iID : 0x80001
m--acName : Jack
m--aDevices[]
|--aDevices[0]
|--|--iDevID : 0xa
|--|--iDevSN : 0x11111111
|--aDevices[1]
|--|--iDevID : 0xb
|--|--iDevSN : 0x22222222
|--aDevices[2]
|--|--iDevID : 0xc
|--|--iDevSN : 0x33333333
|--aDevices[3]
|--|--iDevID : 0xd
|--|--iDevSN : 0x44444444

или другие структурированные данные .. xml / python pickle / json strings / что угодно

Конечно, заголовочный файл, с которым я столкнулся, намного сложнее, в данных будут поля msgtype и msglenth, поэтому я могу выяснить, какая структура правильная и какова ее длина.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

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

Вам действительно нужно будет объяснить свой формат, хотя: как описано ниже, это не такочевидно.


Похоже, у вас 4-октетные целые числа фиксированной длины в порядке с прямым порядком байтов, ОК.

Если я предполагаю строки переменной длины с нулевым терминатором, 4a 61 63 6b 00 = acName:"Jack" и 0a 00 00 00 = iDevID:0x0a выглядит нормально, но между ними есть 3-октетная последовательность, значение которой я не знаю.

Или Jack не завершен нулем, в этом случае он установлен на 4длинных символов, а не 8, которые вы определили для NAME_LEN?Это сделало бы 00 6f 70 65 еще одним 4-байтовым целым числом, но я до сих пор не знаю, что это значит.

...

0 голосов
/ 20 февраля 2012

Насколько сильно вам это нужно?

Возможное решение может заключаться в том, чтобы создать плагин GCC или расширение MELT (MELT - это предметно-ориентированный язык для расширения GCC), но для этого вам необходимо понять некоторые детали внутреннего представление GCC (особенно Tree и, возможно, Gimple), и это займет у вас некоторое время (дни, а не часы).

Если ваши объявления проще, возможно, рассмотрите возможность использования SWIG (или, возможно, анализатора RPCXDR), но это предполагает, что вы можете изменить или упростить их.

...