关于QT中Tcp服务器端接收数据并解析数据的问题解决办法
前提
对于数据传输问题,无非就是数据的类型转换问题,如果想要深刻认识数据传输,就必须知道数据在串行传输过程中或者在TCP传输过程中,都是以二进制位为基础来实现的(也就01010101),深刻了解了这个,后面的数据传输问题相对来说都很好理解了,TCP传输过程中,通过二进制数据传输,那么你接收过来的原始数据也是二进制(原谅我又强调了一遍),到后面你定义什么数据接收,那么这个二进制打印出来的表现形式就是你定义的变量类型(其实变量的本质也是一个存储空间的别名,里面存储的也是一系列二进制数据,所展示出来的只是定义的哪个种类)。接下来我就来介绍一下数据传输过程中所遇到的问题,第一个就是存储问题。
QByteArray
QByteArray类提供了一个字节数组。QByteArray可用于存储原始字节(包括’\0’)和传统的以’\0’结尾的8位字符串。使用QByteArray比使用const char *方便得多。在幕后,它总是确保数据后面跟着一个’\0’终止符,并使用隐式共享(即写即拷)来减少内存使用并避免不必要的数据复制。
如对方发送了9个16进制的字节数据,用QByteArray定义的变量存储的是原始数据。
QByteArray array = TcpSocketList.at(i)->readAll();
这里的TcpSocketList.at(i)是用容器存储的数据,姑且在这里就当QTcpSocket类型的套接字,调试的结果如下图:
因为 QByteArray 是创建了一个字节数组,用来网络存储发送的9个字节,所以看到的是9个数组成员,第二列是字符形式,第三列是十进制形式,第四列是十六进制形式。
因为需要取出其中两个字节作为目标数据([3]和[4]),并且这两个字节需要组合到一起进行十六进制转十进制计算,这样取出数据就有两种方法(目前我想到的)。
第一种
一个字节一个字节取出来然后做十六进制计算:
quint8 m = array.at(3);
quint8 k = array