QMap <int,qbytearray>返回错误的QByteArray

时间:2019-05-27 06:56:51

标签: c++ qt qmap

我正在使用

QMap < int, QByteArray> RegTable; (Seprate Class Variable)

用于存储Modbus寄存器地址和从串行端口接收的数据。一切正常,从串行端口读取数据并正确填充到QByteArray。

qDebug() << Modbus->RegTable[RegAddr].toHex(' '); 

打印正确的数据。但是,如果要使用它编写变量,则始终将相同的值/垃圾存储在该变量中。

    unsigned int unixTimeStamp = 0;
    qDebug() << Modbus->RegTable[RegAddr].toHex(' ');

    unixTimeStamp  = static_cast <unsigned int>Modbus->RegTable[RegAddr].at(4);
    unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(5)<<8;
    unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(6)<<16;
    unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(7)<<24;

    QDateTime timestamp;
    timestamp.setTime_t(unixTimeStamp  );
    qDebug() << timestamp.toString(Qt::SystemLocaleShortDate); //wrong time

RegTable是Modbus类变量,我将其用于主类,但始终会得到错误的数据或值。

1 个答案:

答案 0 :(得分:1)

使用

unixTimeStamp |= ...;

您一次又一次地写入同一字节。您需要移动值:

unixTimeStamp  = static_cast <unsigned int>Modbus->RegTable[RegAddr].at(4) << 24;
unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(5) << 16;
unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(6) <<  8;
unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(7);

当然,根据字节顺序,移位可能必须按照相反的顺序进行。