gpt4 book ai didi

c++ - 将 QByteArray 中的数据放入 Struct

转载 作者:太空狗 更新时间:2023-10-29 21:16:08 27 4
gpt4 key购买 nike

我正在使用一个返回字节数组的串行设备。此数组中的值存储在无符号短裤和无符号字符中。我有以下结构:

    typedef struct {
unsigned short RPM; //0
unsigned short Intakepress; //1
unsigned short PressureV; //2
unsigned short ThrottleV; //3
unsigned short Primaryinp; //4
unsigned short Fuelc; //5
unsigned char Leadingign; //6
unsigned char Trailingign; //7
unsigned char Fueltemp; //8
unsigned char Moilp; //9
unsigned char Boosttp; //10
unsigned char Boostwg; //11
unsigned char Watertemp; //12
unsigned char Intaketemp; //13
unsigned char Knock; //14
unsigned char BatteryV; //15
unsigned short Speed; //16
unsigned short Iscvduty; //17
unsigned char O2volt; //18
unsigned char na1; //19
unsigned short Secinjpulse; //20
unsigned char na2; //21
} fc_adv_info_t;

将数组映射到此结构的最佳方法是什么?从串行设备接收到的数组中的顺序与结构匹配。

最佳答案

首先,您使用类似 C 的语法对结构中数据类型的描述是模棱两可的。它没有告诉我们有关 shortchar 类型的大小,也没有告诉我们数据的字节顺序! short int 不必是 16 位宽,char 也不一定是 8 位!至少,您应该使用 fixed width integer types ,或它们的 Qt 等价物,并指定它们的字节顺序。

此外,typedef struct 是一种 C 主义,在 C++ 中是不必要的。删除 typedef

假设一个大端数据包,unsigned short表示uint16_tunsigned char表示uint8_t,这里你是怎么做到的:

struct FcAdvInfo { // this structure shouldn't be packed or anything like that!
quint16 RPM;
quint16 IntakePress;
...
quint8 LeadingIgn;
...

FcAdvInfo parse(const QByteArray &);
};

FcAdvInfo FcAdvInfo::parse(const QByteArray & src) {
FcAdvInfo p;
QDataStream ds(src);
ds.setByteOrder(QDataStream::BigEndian);
ds
>> p.RPM
>> p.IntakePress
...
>> p.LeadingIgn
...
;
return p;
}

最后,如果你的 struct 来自一些 C 代码,你必须明白它是不可移植的,即使在同一个 CPU 上,如果你升级编译器,打包和结构类型的大小可以而且将会改变!所以不要这样做。 C/C++ struct 声明暗示没有关于数据在内存中的排列方式,除了选择的排列不会导致未定义的行为,并且必须符合其他要求标准(只有少数)。差不多就是这些。

关于c++ - 将 QByteArray 中的数据放入 Struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35972301/

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