С фиксированной структурой
typedef struct {
uint8_t firstName[4];
uint8_t pad1;
uint8_t lastName[3];
uint8_t pad2;
uint8_t dateOfBirth[6];
uint8_t pad3;
uint8_t genre;
uint8_t pad4;
uint8_t car[3];
uint8_t pad5;
uint8_t phone[3];
uint8_t pad6;
}DataStructTypeDef;
Это работает для меня:
int main(void)
{
uint8_t *buffer = "JOHN" "\0" "DOE" "\0" "010119" "\0" "M" "\0" "FOO" "\0" "BAR";
DataStructTypeDef foo;
memcpy((void *)&foo, (void *)buffer, sizeof(DataStructTypeDef));
printf("%s", foo.dateOfBirth); // Expected value 01012019
}
Буфер выглядит ужасно искаженным, потому что если я поставлю "\0" "010119"
как "\0010119"
, это интерпретируетпобег не в ту сторону.Возможно, лучшим решением было бы сохранить его как единое целое и полностью записать восьмеричную последовательность как \000
:
uint8_t *buffer = "JOHN\000DOE\000010119\000M\000FOO\000BAR";
Здесь каждый \000
становится нулевым байтом и не конфликтует с010119
после одной из escape-последовательностей.
В качестве альтернативы, это работает, если я беру исходную строку буфера "JOHN:DOE:010119:M:FOO:BAR"
и просто заменяю все :
после копирования, например:
foo.pad1 = foo.pad2 = foo.pad3 = foo.pad4 = foo.pad5 = foo.pad6 = '\0';