2013-10-09 49 views
1

我有一个函数,它提供数据作为字符串和函数把它放到QByteArray和Socket将这个数组传递给主机。当我尝试Qt QString十六进制值到QByteArray

_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

我需要你的建议,

谢谢 能

回答

2

你toInt()调用使用文本的基础10位的转换。

您需要使用基地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从包含hex的字符串转换的例子也不起作用。我相信这个问题不是由于转换造成的,而是您正在创建的数据包的问题。我不熟悉套接字编程来帮助解决这个问题。

+0

尝试了您的代码,它发送数据时,其80200001。但当我尝试发送80200000 wireshark说畸形的数据包。 – mcan

+0

QByteArray应该处理数据流中的'\ 0'。 wireshark会显示格式错误的数据包包含的数据吗? – drescherjm

+0

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]专家信息(错误/格式错误):格式错误的数据包(发生例外)消息:格式错误的数据包(发生例外)严重性级别:错误组:格式错误 – mcan