Qt QString十六进制值到QByteArray

时间:2013-10-09 12:24:34

标签: c++ qt sockets wireshark qbytearray

我有一个函数,它将数据作为字符串和函数提供给QByteArray,Socket将此数组传递给主机。当我尝试

_strdata = "80200000"

此数据是十六进制数据。在wireshark上传输的数据应为0x80200000。

我的尝试:

void DataTransmitter(const QString & _strdata)
{
   QByteArray myData = QByteArray::fromHex(_strdata.toLatin1());

   PUDPSocket->writeDatagram(myData.data(), myData.size(), host, port);
}

OUTPUT:wireshark:格式错误的数据包

void DataTransmitter(const QString & _strdata)
{
    QString d1,d2,d3,d4;
    d1.append(_strdata[0]);d1.append(_strdata[1]);
    d2.append(_strdata[2]);d2.append(_strdata[3]);
    d3.append(_strdata[4]);d3.append(_strdata[5]);
    d4.append(_strdata[6]);d4.append(_strdata[7]);

    QByteArray data;
    data.append((char) d1.toInt());
    data.append((char) d2.toInt());
    data.append((char) d3.toInt());
    data.append((char) d4.toInt());

    PUDPSocket->writeDatagram(data.data(),data.size(),host,port);
    d1.clear();
    d2.clear();
    d3.clear();
    d4.clear();
}

OUTPUT:wireshark:再次出现格式错误的数据包

当我将数据更改为" 80200001" wireshark:50:14:00:01

我需要你的建议,

谢谢你, 可以

1 个答案:

答案 0 :(得分:2)

您的toInt()调用正在使用文本的基本10转换。

您需要使用base 16进行toInt()调用,如下所示:

 bool bOk;
 d1.toInt(&bOk,16);

所以整个代码是:

 void DataTransmitter(const QString & _strdata)
{
    QString d1,d2,d3,d4;
    d1.append(_strdata[0]);d1.append(_strdata[1]);
    d2.append(_strdata[2]);d2.append(_strdata[3]);
    d3.append(_strdata[4]);d3.append(_strdata[5]);
    d4.append(_strdata[6]);d4.append(_strdata[7]);

    bool bOK;
    QByteArray data;
    data.append((char) d1.toInt(&bOK,16));
    data.append((char) d2.toInt(&bOK,16));
    data.append((char) d3.toInt(&bOK,16));
    data.append((char) d4.toInt(&bOK,16));

    PUDPSocket->writeDatagram(data.data(),data.size(),host,port);
    d1.clear();
    d2.clear();
    d3.clear();
    d4.clear();
}

编辑:正如您在下面指出的那样,这不能解决格式错误的数据包问题。而你的另一个使用Qt从包含十六进制的字符串转换的例子也不起作用。我认为问题不是由于转换造成的,而是您正在创建的数据包的问题。我不熟悉套接字编程来帮助解决这个问题。