【问题标题】:Qt QString hex value to QByteArrayQt QString 十六进制值到 QByteArray
【发布时间】:2013-10-16 19:21:52
【问题描述】:

我有一个函数将数据作为字符串提供,函数将其放入 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);
}

输出: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

我需要你的建议,

谢谢你, 可以

【问题讨论】:

    标签: c++ qt sockets wireshark qbytearray


    【解决方案1】:

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

    【讨论】:

    • 试过你的代码,它在 80200001 时发送数据正常。但是当我尝试发送 80200000 时,wireshark 说数据包格式错误。
    • 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
    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 2023-03-28
    • 2016-11-27
    • 1970-01-01
    • 2018-07-26
    • 2016-10-14
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多