发布网友 发布时间:2022-04-29 20:23
共3个回答
热心网友 时间:2022-04-18 10:08
在Python中使用struct模块打包数据和在C/C++语言中定义一个结构体(也是把多个成员打包到一块)差不多。追答由于数据包长度不是固定的,而且数据包也不复杂,这里就不用定义结构体了。可以按照如下方式处理(假设你的TCP Server中包含一个QTcpSocket的子类——ClientObj,来表示一个连接对象):
ClientObj::ClientObj(QObject *parent) :
QTcpSocket(parent)
{
connect(this, SIGNAL(readyRead()), this, SLOT(readClient()));
}
void ClientObj::readClient()
{
QDataStream in(this);
in.setVersion(QDataStream::Qt_5_2);
in.setByteOrder(QDataStream::LittleEndian);
qlonglong totalSize;
qlonglong fileNameLen;
QByteArray fileNameBytes;
in >> totalSize >> fileNameLen;
fileNameBytes = read(fileNameLen);
QString fileName(fileNameBytes);
std::cout << totalSize << ", " << fileNameLen << ", " << qPrintable(fileName) << std::endl;
}
需要注意的一点是服务器端接收数据的时候,需要和客户端打包时使用相同的端序。Python 3.x中:
fhead = struct.pack('qq%ds'%len(filename),totalSize,len(filename),filename)
生成一个小端的数据包;
那么,在使用QDataStream来解析数据包时,也要指定为小端。否则,多字节的整数的高低字节顺序就反了。
QDataStream默认使用大端,这也是我调用setByteOrder的原因(我觉得,让客户端把数据以大端方式打包发送会更妥当)。
热心网友 时间:2022-04-18 11:26
好像不是这样用的吧热心网友 时间:2022-04-18 13:00
qt是c++?去c++吧问问