QTcpSocket:解码接收到的数据

时间:2019-05-22 19:24:02

标签: c++ qt qt5 qtcpsocket

我需要对从Universal Robot UR5服务器接收的数据进行解码。收到的数据如下。有人可以帮我使用Qt5 c ++解码此消息吗?

\x00\x00\x04T@\xE2\xB2\xB8\xD4\xFD\xF3\xB6@\t\"\xD0\xE5`A\x8A\xBF\xF9\"\xD0\xE5`A\x88?\xF9\"\xD0\xE5`A\x89@\x12\xD9\x16\x87+\x02\f@\x12\xD9\x16\x87+\x02\f@\t\"\xD0\xE5`A\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xBB\xE0""f\xD1\x1B\xE1\x95\x8B\xBF\xF5\xB6\x18\xBE\xB0YA\xBF\xF5\xB8\x9E\xE6\xCB\xD9\xBC\xBF\xC4^\\\xFC^\x81i\xBE\xEE@\x01\xF2\xD7\b\x05\x00\x00\x00\x00\x00\x00\x00\x00\xBC\x19\xE2""B\x00\x00\x00\x00\xC0""1!\xAF\x86w&m\xC0""1#\xAD""b\x1C\xD9\xCE\xBF\xF7\xB5\xA6.\xF4Tz\xBF!\x9B\x1B\xF6\x80\xFFP\x00\x00\x00\x00\x00\x00\x00\x00@\t\"\xD0\xE0\x00\x00\x00\xBF\xF9\"\xD0\xD1\x10\xB4`?\xF9\"\xD0\xE0\x00\x00\x00@\x12\xD9\x16\x80\x00\x00\x00@\x12\xD9\x16\x80\x00\x00\x00@\t\"\xD0\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xBB\xE0""f\xD1 \x00\x00\x00\xBF\xF5\xB6\x18\xC0\x00\x00\x00\xBF\xF5\xB8\x9E\xE0\x00\x00\x00\xBF\xC4^]\x00\x00\x00\x00\xBE\xEE@\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xBB\xE0""f\xD1 \x00\x00\x00\xBF\xF5\xB6\x18\xC0\x00\x00\x00\xBF\xF5\xB8\x9E\xE0\x00\x00\x00\xBF\xC4^]\x00\x00\x00\x00\xBE\xEE@\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xDF(\xD4\xDE\xE9Z\x10?\xBB\xF7\xD1N%*9?\xD0\xC2\xE6\xB9\x87\x1C\xE1@\x01\xC4\xB7+\x83\x8B\xD2@\x01\xC4\xB7\x14\xE4\x1D\xCA>\x93q]e!\xED\xD8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\xAE\x18\xA0\x85\x9A\xCB'>\x8B\r\xC1""E\x1F\x9C\x06>\xAC\xB0\xAA\xDB\xDFm,\xBEkF\xDE""b\x8D\xBCQ>\x95\xADv\x92\xF8(\xF5\xBD\xE3\xFC\x04\x11\xC6\xD3\x19?\xDF(\xD4\xA9\xCF\xAD\x8C?\xBB\xF7\xD2\x15\x90\xF0\xA6?\xD0\xC2\xE6\xCB\xBC]O@\x01\xC4\xB7""6\x1C\xF6\x04@\x01\xC4\xB7\x1F\x7F\xE0M>\x97\x96""3\x90\xB0*\xE2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00?\xC1\xF0g\x05\xC8\x96\xDD@ \x00\x00\x00\x00\x00\x00@\x1C\x00\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00?\xF0\x00\x00\x00\x00\x00\x00@\x13\xB8\xAA\x9D\x1AX\xAE@\x14k\xD0*\xDC-\xAE@\x15\xAEW\xC1q\x0E\xBC@\f\xDBv7\x18'\xDA@\x0B\x03t\x19\x01\xE5{?\xF1\x05\x92*d

这适用于下面的python代码。但是我需要在Qt5 c ++中执行此操作。

     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.settimeout(10)
     s.connect((HOST, PORT_30003))
     time.sleep(1.00)
     print ""
     packet_1 = s.recv(4)
     packet_2 = s.recv(8)
     packet_3 = s.recv(48)
     packet_4 = s.recv(48)
     packet_5 = s.recv(48)
     packet_6 = s.recv(48)
     packet_7 = s.recv(48)

     #reading current joint values from 48 bytes

     packet_18 = s.recv(8)
     packet_18 = packet_18.encode("hex") #convert the data from \x hex notation to plain hex
     q1 = str(packet_18)
     q1 = struct.unpack('!d', packet_18.decode('hex'))[0]
     print "q1 = ", q1 * 180/3.1416

     packet_19 = s.recv(8)
     packet_19 = packet_19.encode("hex") #convert the data from \x hex notation to plain hex
     q2 = str(packet_19)
     q2 = struct.unpack('!d', packet_19.decode('hex'))[0]
     print "q2 = ", q2 * 180/3.1416

     packet_20 = s.recv(8)
     packet_20 = packet_20.encode("hex") #convert the data from \x hex notation to plain hex
     q3 = str(packet_20)
     q3 = struct.unpack('!d', packet_20.decode('hex'))[0]
     print "q3 = ", q3 * 180/3.1416

     packet_21 = s.recv(8)
     packet_21 = packet_21.encode("hex") #convert the data from \x hex notation to plain hex
     q4 = str(packet_21)
     q4 = struct.unpack('!d', packet_21.decode('hex'))[0]
     print "q4 = ", q4 * 180/3.1416

     packet_22 = s.recv(8)
     packet_22 = packet_22.encode("hex") #convert the data from \x hex notation to plain hex
     q5 = str(packet_22)
     q5 = struct.unpack('!d', packet_22.decode('hex'))[0]
     print "q5 = ", q5 * 180/3.1416

     packet_23 = s.recv(8)
     packet_23 = packet_23.encode("hex") #convert the data from \x hex notation to plain hex
     q6 = str(packet_23)
     q6 = struct.unpack('!d', packet_23.decode('hex'))[0]
     print "q6 = ", q6 * 180/3.1416

1 个答案:

答案 0 :(得分:0)

我可以使用以下代码自行解码数据:

// joint values
double q1 = 0, q2=0, q3=0, q4=0, q5=0, q6=0;
// pose values
double x = 0, y=0, z=0, rX=0, rY=0, rZ=0;

QByteArray array;
array = p_socket->readAll();

// decoding length data
int length = 0;
memcpy(&length, array.constData(), 4);
length = qToBigEndian(length);
qDebug() << length;

int byteLength = 8;

// decoding joint 1 value
QByteArray jointArray1 = array.mid(252,byteLength).toHex();
long long currentJointPosition1=jointArray1.toLongLong(0,16);
q1 = reinterpret_cast<double&>(currentJointPosition1);

// decoding joint 2 value
QByteArray jointArray2 = array.mid(252+1*byteLength,byteLength).toHex();
long long currentJointPosition2=jointArray2.toLongLong(0,16);
q2 = reinterpret_cast<double&>(currentJointPosition2);