有没有办法"QByteArray"变量数据直接放入变量"int"而无需强制转换?



您尝试执行的转换不仅仅是将QByteArray数据转换为整数。 例如,假设 QByteArray a [3] 包含 [0] = 36、1 = 23 和 [2] = 12 个数据,则使用 b 变量,格式为 b = 362312。我想这样做。

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

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

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

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一样使用它。 为了做到这一点,我认为它会转换为字符串,然后转换为整数,但即使是字符串也不是正常的输出。

我还附上了下面当前打印出来的奇怪字符串。 在此处输入图像描述

由于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

最新更新