我遇到了向结构转换字节数组的问题,忽略或跳过了一些字节。
给出以下结构,
typedef struct
{
uint32_t id;
uint16_t test;
uint8_t group;
uint32_t time;
uint16_t duration;
uint8_t a;
uint8_t b;
uint8_t c;
uint16_t d;
uint16_t e;
uint8_t status;
uint8_t x;
uint8_t y;
} testStruct_t, *PtestStruct_t;
我有一个包含以下测试数据的数组:
uint8_t pBuff = { 0x11 , 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 };
施法如下:
PtestStruct_t pStruct = (PtestStruct_t)pBuff;
结构中的某个地方会跳过或忽略某些字节。我不知道为什么。 这已经在Visual Studio 2012和需要进行此测试和调试的ARM处理器上进行了测试。
我在这里缺少什么?我不相信它与Endian有关。它可能是两个测试用例中的编译器,我不知道在最后一种情况下该怎么做。
被跳过/忽略的字节是0x88
和0x14
答案 0 :(得分:9)
您遇到了对齐填充。
uint32_t id; // offset 0
uint16_t test; // offset 4
uint8_t group; // offset 6
uint32_t time; // offset 7
此处显示的偏移可能是错误的。编译器可能会在“group”和“time”之间放置填充,以确保“时间”在4字节边界上(实际对齐是可配置的)
如果您绝对要求结构如此,则可以使用#pragma pack
#pragma pack(push, 1)
typedef struct
{
uint32_t id;
uint16_t test;
uint8_t group;
uint32_t time;
uint16_t duration;
uint8_t a;
uint8_t b;
uint8_t c;
uint16_t d;
uint16_t e;
uint8_t status;
uint8_t x;
uint8_t y;
} testStruct_t, *PtestStruct_t;
#pragma pack(pop)
答案 1 :(得分:1)
编译器可能在您的struct字段之间添加了一些字节以进行对齐。 您需要使用打包来阻止编译器进行填充 - 这必须明确请求 - 在GCC下它是属性((压缩)),
示例:
struct __attribute__((__packed__)) mystruct_A {
char a;
int b;
char c;
};
并为Visual Studio咨询MSDN