Чтобы убедиться, что я понимаю вопрос:
Во встроенной системе у вас есть структура, содержащая системные настройки, которая выглядит примерно так:
struct SubStruct{
int subSetting1;
float subSetting2;
}
/* ... some other substructure definitions. ... */
struct Settings{
float setting1;
int setting2;
struct SubStruct setting3;
/* ... lots of other settings ... */
}
А ваша проблема в том, что вы хотите взять двоичный файл, содержащий указанную структуру, и изменить значения на другом компьютере?
Учитывая, что вы знаете размеры целочисленных типов и упаковку, используемую встроенной системой, у вас может быть два варианта. Если порядковый номер вашей встроенной системы и системы ПК отличается, вам также придется иметь дело с этим, например, используя hton
при написании полей.
Вариант 1:
Объявите ту же структуру в вашей программе на ПК, с прагмами для принудительного выравнивания байтов, что и во встроенной системе, и с любыми целочисленными типами, которые различаются по размеру между встроенной и ПК-системами, «перепечатанными» до конкретных размеров, например, используя int16_t, int32_t, если у вас есть stdint.h, или ваши собственные typedefs, если нет, на вашей программе для ПК.
Вариант 2:
Вы можете просто составить список типов, например, список, который выглядит так:
Name Type
setting1 float
setting2 int
subStruct1SubSetting1 int
subStruct1SubSetting2 float
А затем рассчитайте местоположения на основе размеров и упаковки, используемых встроенной системой, например, если во встроенной системе используется 4-байтовое выравнивание, 4-байтовые числа с плавающей запятой и 2-байтовые числа, вышеприведенная таблица рассчитывает:
Name Type Calculated Offset
setting1 float 0
setting2 int 4
subStruct1SubSetting1 int 8
subStruct1SubSetting2 float 12
или если встроенная система упаковывает структуру в 1-байтовое выравнивание (например, если это 8-битный микро)
Name Type Calculated Offset
setting1 float 0
setting2 int 4
subStruct1SubSetting1 int 6
subStruct1SubSetting2 float 8