有没有一种方法可以将“ QByteArray”变量数据直接放入“ int”变量而无需转换?

时间:2019-10-17 08:46:52

标签: c++ qt qml

您要进行的转换不仅仅是将QByteArray数据转换为int。 例如,假设QByteArray a [3]包含[0] = 36,1 = 23,并且[2] = 12数据,请使用int b形式的b变量,其形式为b = 362312。我想做。

为了将QByteArray数据用作int数据,将QByteArray变量分配给QString变量并将其强制转换为字符串变量。 我试图打印出字符串变量,但是输出了奇怪的未知数据。

在确认字符串可以正常打印后,我尝试使用toInt()转换字符串,但是该字符串被打印为奇怪的字符。 所以我不能做toInt()。

我运行了很多测试,并且代码混乱。 我没有删除评论的原因并不是要表明我已经尝试了各种方法。

 if (QCanBus::instance()->plugins().contains(QStringLiteral("socketcan"))) {
            qWarning() << "plugin available";
        }

        QString errorString;
        QCanBusDevice *device = QCanBus::instance()->createDevice(
            QStringLiteral("socketcan"), QStringLiteral("vcan0"), &errorString);
        if (!device) {
            qWarning() << errorString;
        } else {
            device->connectDevice();
            std::cout << "connected vcan0" << std::endl;

            device->connect(device, &QCanBusDevice::framesReceived, [this, device]() {

            QCanBusFrame frame = device->readFrame();
            QString testV = frame.toString();
//            int testI = testV.split(" ")[0].toInt();

            QString qvSpeed = frame.payload();
//            int a = frame.payload().length();

            std::string text = testV.toUtf8().constData();
            std::string vSpeed = qvSpeed.toLocal8Bit().constData();

            //At that point the vVal values ​​are being updated in real time.
            //I want to pass the updated vVal to qml gui in real time.
//            int vVal = static_cast<int>(frame.payload()[0]);


//            for(int i = 0; i < frame.payload().length(); ++i)
//                std::cout << std::hex << static_cast<int>(frame.payload()[i]);

//            std::cout << std::endl;


//            if(vVal)
//            int tSpeed = static_cast<int>(frame.payload()[0]);
//            std::stringstream stream;
//            stream <<

            testVal1 += 0;

//            if(frame.frameId() == 001)
//                testVal2 = static_cast<int>(frame.payload()[0]);

//            testVal2 += 20;

//            duration += 200;
//            emit sendMessage(testVal1, testVal2);

            std::cout << vSpeed << std::endl;


//            if(frame.frameId() == 001)
//                std::cout << testI << std::endl;

//            std::cout << "--------------" << std::hex << static_cast<int>(frame.payload()[0]) << "----------------" << std::endl;
            });
        }

最后,QByteArray a [3] = {32,34,12}​​; 假设您有数据,则要像int b = 323412这样使用。 为此,我认为它将先转换为字符串,然后转换为整数,但即使字符串也不是正常输出。

我还附加了当前打印在下面的奇怪字符串。 enter image description here

1 个答案:

答案 0 :(得分:0)

由于QByteArray将其数据存储为char *,因此您只需转换其内部数据即可,例如:

#include <QCoreApplication>
#include <iostream>
#include <iomanip>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    uint32_t num = 1234;

    std::cout << "original number:" << num << std::endl;

    std::cout << "bytes: " << std::endl;
    QByteArray arr(reinterpret_cast<char *>(&num), sizeof(uint32_t));
    for(int i = 0;i < arr.size();i ++)
    {
        std::cout << "  0x" << std::hex << std::setfill('0') << std::setw(2) << (arr.at(i) & 0xFF) << std::endl;
    }

    uint32_t *num2 = reinterpret_cast<uint32_t *>(arr.data());

    std::cout << "casted number :" << std::dec << *num2 << std::endl;

    return a.exec();
}

但是我不推荐这种'C'方法,因为它充满了错误。 顺便说一句,我从未见过将CAN数据转换为QString。通常它只有8个字节的数据,您值得将其强制转换为数据结构,例如:

struct Data
{
    uint32_t value1;
    uint32_t value2;

} inData, outData;


inData.value1 = 1234;
inData.value2 = 5678;

QByteArray arr(reinterpret_cast<char *>(&inData), sizeof(Data));

outData = *reinterpret_cast<Data *>(arr.data());
//memcpy(&outData, arr.data(), static_cast<size_t>(arr.size())); // or this