// 数据帧结构体定义 #pragma pack(push 1) typedef struct { uint8_t cmd; uint8_t param; void *data; }info_t; typedef struct { uint16_t head; uint8_t addr; uint8_t index; uint8_t size; uint8_t sep; info_t info; uint16_t crc; uint32_t tail; }comm_frame_t; #pragma pack(pop) // 假设frame_buf是接收到的数据 static uint8_t frame_buf[] = {0xee 0x7e 0x02 0x03 0x04 0x55 0x06 0x70 0x29 0x12 0x21 0x20 0x07 0x21 0xff 0xff 0xfc 0xff}; // 想使用如下方式进行简单快速的解包 void unpack(void) { comm_frame_t *frame = (comm_frame_t *)frame_buf; frame->info.data = &frame_buf[9]; printf("head:0x%04X " frame->head); printf("my_addr:0x%02X " frame->my_addr); printf("aim_addr:0x%02X " frame->aim_addr); printf("index:0x%02X " frame->index); printf("size:%d " frame->size); printf("sep:0x%02X " frame->sep); printf("cmd:0x%02X " frame->info.cmd); printf("param:0x%02X " frame->info.param); printf("data:0x%X.\r\n" *(uint32_t *)(frame->info.data)); } 问题: 1、其他成员都正常,在索引信息段内的data时 *(uint32_t *)(frame->info.data)出错,得到的结果貌似是一个地址; 2、单独直接使用 value = *(uint32_t *)&frame_buf[9]肯定没问题,但加上 frame->info.data = &frame_buf[9]; 再执行前者得到的结果和上一条相同; 百思不得其解,请大佬指教
*(uint32_t *)(frame->info.data) 的用法都是错误的,
根据前面的程序,
frame->info.data 是指向 comm_frame_t 结构的指针,而不是普通的uint32_t 类型 的指针
后面的处理其实都是有问题的。