gpt4 book ai didi

c++ - C:将字节数组转换为结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:33 26 4
gpt4 key购买 nike

我在将字节数组转换为结构时遇到问题,一些字节被忽略或跳过。

给定以下结构,

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 相关。它可能是两个测试用例中的编译器,我不知道在最后一个案例中该怎么做。

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

最佳答案

您遇到对齐填充。

uint32_t id;     // offset 0
uint16_t test; // offset 4
uint8_t group; // offset 6
uint32_t time; // offset 7

此处显示的偏移量很可能是错误的。编译器可能会在“组”和“时间”之间放置填充以确保“时间”在 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)

关于c++ - C:将字节数组转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19995440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com