C:将字节数组转换为struct

Arm*_*ndt 5 c c++ arrays struct

我有一个将字节数组转换为结构的问题,忽略或跳过一些字节.

鉴于以下结构,

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;
Run Code Online (Sandbox Code Playgroud)

我有一个包含以下测试数据的数组:

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 };
Run Code Online (Sandbox Code Playgroud)

铸造如下:

PtestStruct_t pStruct = (PtestStruct_t)pBuff;
Run Code Online (Sandbox Code Playgroud)

在结构的某处,某些字节被跳过或忽略.我不知道为什么.这已经在Visual Studio 2012和需要进行此测试和调试的ARM处理器上进行了测试.

我在这里错过了什么?我不相信它与Endian有关.它可能是两个测试用例中的编译器,我不知道在最后一种情况下该怎么做.

被跳过/忽略的字节是0x880x14

kfs*_*one 10

你遇到了对齐填充.

uint32_t id;     // offset 0
uint16_t test;   // offset 4
uint8_t group;   // offset 6
uint32_t time;   // offset 7
Run Code Online (Sandbox Code Playgroud)

此处显示的偏移可能是错误的.编译器可能会在"组"和"时间"之间放置填充,以确保"时间"在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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,即使在1字节打包(仍然*必须*遵守硬件对齐要求)之后,您仍然依赖于多字节缩放器的字节序. (9认同)