在 header 结构之后访问数据
Access data after a header structure
我正在做一些网络编程,我用一些struct
来描述我的框架header这样的:
struct my_frame_header {
uint16_t field1;
uint16_t field2;
};
所以,当我有一个缓冲帧时,我可以做类似的事情:
uint8_t buffer[BUFFER_SIZE];
struct my_frame_header *frame_header = (struct my_frame_header *)buffer;
my_read(buffer, BUFFER_SIZE);
我现在可以像这样访问 header 字段:
ntohl(frame_header->field1);
现在,我的问题是:在结构之后访问数据的最优雅的方式是什么? (即在数据部分)
好吧,如果我正确理解你的问题,你可以这样做
uint8_t * data = (uint8_t *)buffer + sizeof (struct my_frame)
那么,data
将是指向 header 之后的下一个 uint8_t
元素的指针。
uint8_t buffer[BUFFER_SIZE];
struct my_frame_header *frame_header = (struct my_frame_header *)buffer;
这是错误的,buffer
的基地址可以不对齐my_frame_header
。
另一方面:
The block that malloc gives you is guaranteed to be aligned so that it
can hold any type of data.
那么,你可以使用malloc
来跳过这个问题:
uint8_t *buffer = malloc(BUFFER_SIZE);
我正在做一些网络编程,我用一些struct
来描述我的框架header这样的:
struct my_frame_header {
uint16_t field1;
uint16_t field2;
};
所以,当我有一个缓冲帧时,我可以做类似的事情:
uint8_t buffer[BUFFER_SIZE];
struct my_frame_header *frame_header = (struct my_frame_header *)buffer;
my_read(buffer, BUFFER_SIZE);
我现在可以像这样访问 header 字段:
ntohl(frame_header->field1);
现在,我的问题是:在结构之后访问数据的最优雅的方式是什么? (即在数据部分)
好吧,如果我正确理解你的问题,你可以这样做
uint8_t * data = (uint8_t *)buffer + sizeof (struct my_frame)
那么,data
将是指向 header 之后的下一个 uint8_t
元素的指针。
uint8_t buffer[BUFFER_SIZE];
struct my_frame_header *frame_header = (struct my_frame_header *)buffer;
这是错误的,buffer
的基地址可以不对齐my_frame_header
。
另一方面:
The block that malloc gives you is guaranteed to be aligned so that it can hold any type of data.
那么,你可以使用malloc
来跳过这个问题:
uint8_t *buffer = malloc(BUFFER_SIZE);