gpt4 book ai didi

c++ - 转换指针以重用缓冲区

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

那里: 我有这样的声明:

typedef struct
{
quint8 mark1;
quint16 content1;
quint16 content2;
quint8 mark2;
}FrameHead;

在函数中,我定义了一个缓冲区,并对其赋值:

quint8 buf[40];
FrameHead *frame = (FrameHead *)buf;
frame->mark1 = 0x68;
frame->content1 = 0x3A;
frame->content1 = 0x3A;
frame->mark2 = 0x68;

所以按照我的想法,buf的前6个字节应该是“68 3A 00 3A 00 68”。但事实是,buf的前8个字节是“68 90 3A 00 3A 00 68 80”。我用过:

qDebug() << (quint8 *)(++frame) - buf// output "8" but should be "6"

似乎数字“0x68”没有存储为 quint8 类型,而是 quint16 类型以与其他 quint16 类型保持一致。任何人都遇到过同样的问题,有什么建议。

最佳答案

这是由于对齐。 16 位类型在 16 位地址上对齐。由于您的第一个成员仅使用 8 位,因此插入了 1 个字节的填充。

如果您将结构重新排序为

typedef struct
{
quint8 mark1;
quint8 mark2;
quint16 content1;
quint16 content2;
}FrameHead;

它将只使用 6 个字节,因为不需要填充来对齐 content1

参见 Structure padding and packing以获得更详细的解释。

评论后编辑:

所以要么你使用 #pragma pack(1)(参见:http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=VS.100%29.aspx)(不确定你的意思是什么

to set alignment in Qt like "#Pragma" in VC"

) 或者你简单地使用一个数组:

typedef quint[6] FrameHead;

....

FrameHead fh1 = {0x68, 0x00, 0x00, 0x00, 0x00, 0x68};
// or
FrameHead fh2;
memset( fh2, 0, sizeof(FrameHead));
fh2[0] = 0x68;
fh2[5] = 0x68;

关于c++ - 转换指针以重用缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320492/

25 4 0
文章推荐: c++ - operator<< 在我的类里面使用不明确
文章推荐: javascript - 移动动态网站
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com