Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt QString十六进制值到QByteArray_C++_Qt_Sockets_Wireshark_Qbytearray - Fatal编程技术网

C++ Qt QString十六进制值到QByteArray

C++ Qt QString十六进制值到QByteArray,c++,qt,sockets,wireshark,qbytearray,C++,Qt,Sockets,Wireshark,Qbytearray,我有一个函数,它以字符串的形式提供数据,并将数据放入QByteArray,然后套接字将该数组传输到主机。当我尝试 _strdata = "80200000" 该数据是十六进制数据。wireshark上传输的数据应为0x80200000。 我的尝试: void DataTransmitter(const QString & _strdata) { QByteArray myData = QByteArray::fromHex(_strdata.toLatin1()); PU

我有一个函数,它以字符串的形式提供数据,并将数据放入QByteArray,然后套接字将该数组传输到主机。当我尝试

_strdata = "80200000"
该数据是十六进制数据。wireshark上传输的数据应为0x80200000。

我的尝试:

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

   PUDPSocket->writeDatagram(myData.data(), myData.size(), host, port);
}
输出: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();
}
输出:wireshark:再次出现格式错误的数据包

当我将数据更改为“80200001”时,wireshark:50:14:00:01

我需要你的建议

谢谢,, Can

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

对于toInt()调用,需要使用base 16,如下所示:

 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从包含十六进制的字符串转换的示例也不起作用。我相信问题不是由于转换,而是您正在创建的数据包的问题。我不熟悉socket编程来帮助解决这个问题。

尝试了您的代码,它在80200001时发送数据正常。但当我尝试发送80200000时,wireshark说格式错误的packet.QByteArray应该处理数据流中的“\0”。wireshark是否显示格式错误的数据包包含哪些数据?wireshark输出:Internet协议版本4,Src:192.168.0.202(192.168.0.202),Dst:192.168.0.80(192.168.0.80)用户数据报协议,Src端口:hpvmmagent(1125),Dst端口:danf-ak2(1041)[格式错误的数据包:TFTP]专家信息(错误/格式错误):格式错误的数据包(发生异常)消息:格式错误的数据包(发生异常)严重级别:错误组:格式错误如果发送“80200001”,则表示协议为TFTP。否。它发送没有问题。Wireshark输出:数据(4字节)数据:80200001长度:4