您要进行的转换不仅仅是将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
答案 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