我有这个代表通用消息的结构
typedef struct {
uint16_t length;
uint8_t type1;
uint8_t type2;
uint8_t *data;
} generic_msg_t;
读完 type1 和 type 2 后我可以知道它对应的是哪条具体消息,例如这个:
typedef struct {
uint16_t length;
uint8_t type1;
uint8_t type2;
uint16_t a;
uint8_t b;
uint8_t c;
double d;
double e;
double f;
double g;
double h;
uint8_t i;
} specific_msg_t;
假设 msg 包含经过验证的数据,我想了解为什么如果我这样做,我无法访问 d、e、f、g、h 数据(但也可以访问 a、b、c)
specific_msg_t * specific_msg = (specific_msg_t *) msg;
uint16_t a = specific_msg->a; //OK
double d = specific_msg->d; //NOK`
我必须这样做:
unsigned char * buffer = (unsigned char *) msg;
double d = buffer[15] + (buffer[14] << 8) + (buffer[13] << 16) + (buffer[12] << 24) + (buffer[11] << 32) + (buffer[10] << 40) + (buffer[9] << 48) + (buffer[8] << 56);`
最佳答案
special_msg_t
与 generic_msg_t
具有潜在不同的对齐要求,因此在某些架构上,该代码可能会导致崩溃 - 编译器没有特殊要求来对齐 generic_msg_t 对象适合访问 double 的边界。
这将有助于准确了解您遇到的错误。
关于将一个结构转换为另一个结构以获取特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150631/