gpt4 book ai didi

c - memcpy 复制了错误的字节数

转载 作者:太空宇宙 更新时间:2023-11-04 05:18:56 25 4
gpt4 key购买 nike

1.我有以下结构。

typedef struct
{ unsigned int ibaseRecord;
unsigned int irecordNumber;
unsigned char brecordType;
unsigned char brevision;
unsigned int ipageNumber;
unsigned int ireserve1;
unsigned int ireserve2;
unsigned int ireserve3;
unsigned short scrc16;
} DATABASEPAGEHEADER_TypeDef;

我还有以下存储数组的字节缓冲区。

char  msg_response[]={0x9A,0x17,0x00,0x00,0x17,0x00,0x00,0x00,0x04,0x02,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0xEA,0x4A,0x86};

我希望使用 memcpy 将缓冲区映射到结构中。

 DATABASEPAGEHEADER_TypeDef * varPageHeader;
varPageHeader=(DATABASEPAGEHEADER_TypeDef*)malloc(sizeof(DATABASEPAGEHEADER_TypeDef));
memcpy(varPageHeader,msg_response,sizeof(DATABASEPAGEHEADER_TypeDef));

然而,结果却一团糟。这是我使用 gdb 进行的检查(探索结构)。在 ipageNumber 之前一切都很好,我预计它的值为 0x0000009f。稍后在 ireserveX (x=1,2,3) 中也是如此。

ibaseRecord = 0x179a .. (Value of type 'unsigned int')
irecordNumber = 0x17 .. (Value of type 'unsigned int')
brecordType = 0x4 .. (Value of type 'unsigned char')
brevision = 0x2 .. (Value of type 'unsigned char')
ipageNumber = 0x0 .. (Value of type 'unsigned int')
ireserve1 = 0x0 .. (Value of type 'unsigned int')
ireserve2 = 0x0 .. (Value of type 'unsigned int')
ireserve3 = 0xea230000 .. (Value of type 'unsigned int')
scrc16 = 0x864a .. (Value of type 'short unsigned int')
(gdb) print sizeof(unsigned int)
$7 = 0x4

有人有办法解决吗?

问题解决了。这是结构对齐问题。感谢您的帮助。

最佳答案

结构成员正在按照其大小的单位对齐。因此该结构在 unsigned char brevisionunsigned int iPageNumber 之间有一个 2 字节的间隙,因此 iPageNumber 从 4 字节边界开始。我不知道删除该填充的符合标准的方法,但对于 GCC,您可以指定 __attribute__((packed)):

typedef struct __attribute__((packed)) {
unsigned int ibaseRecord;
unsigned int irecordNumber;
unsigned char brecordType;
unsigned char brevision;
unsigned int ipageNumber;
unsigned int ireserve1;
unsigned int ireserve2;
unsigned int ireserve3;
unsigned short scrc16;
} DATABASEPAGEHEADER_TypeDef;

不过,如果你想让它可以适本地移植;根本不要使用该属性或 memcpy。相反,从字节数据单独初始化结构字段,并考虑使用特定大小的数据类型,如 uint32_t 而不是 unsigned int

关于c - memcpy 复制了错误的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820993/

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