Частично касаясь обсуждаемой темы. Для поддержки разметки формата хранения данных и не привязываясь к их размещению в структуре давным давно сделал примерно такое и до сих пор хватает. Можно оптимизировать, добавлять сахарку (чтобы не повторяться с именами в макросах), но тут показана сама идея.
struct t_DeviceSettings
{
int iIdent;
t_KeyboardValues KeyboardValues;
time_t tmLastEvent;
unsigned long ulPeriodSec;
unsigned long ulDurationSec;
float fFlowScale;
unsigned long ulWaterDoseMl;
};
#define OFFSET_SETTINGS(MEMBER) (int)(&((struct t_DeviceSettings*)0)->MEMBER)
void WriteBuffer(void *pBuffer, const int iAddr, const int iSize);
void ReadBuffer(void *pBuffer, const int iAddr, const int iSize);
...
float fFlowScaleWrite = 1.0;
WriteBuffer(&fFlowScaleWrite, OFFSET_SETTINGS(fFlowScale), sizeof(fFlowScaleWrite));
Тут прием в вычислении смещения переменной в структуре, чтобы работать только с ней (макрос). Все остальное фигня.