问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

qt中如何解包利用python 的struct.pack()函数打包的数据

发布网友 发布时间:2022-04-29 20:23

我来回答

3个回答

热心网友 时间:2022-04-18 10:08

在Python中使用struct模块打包数据和在C/C++语言中定义一个结构体(也是把多个成员打包到一块)差不多。
只要客户端告诉了你打包的数据的格式(比如:数据包的总长度、数据包中各个数据域的长度及类型,以及端序——大端还是小端),然后定义一个等价的C语言结构体,并把接收到的数据放入一个这样的结构体变量(对象)中就完成了解包工作。然后,访问结构体中的特定成员,就是访问传送过来的特定数据了。追问我在python中打包的数据格式为

fhead = struct.pack('qq%ds'%len(filename),totalSize,len(filename),filename)
请问在qt中应该如何定义struct呢?

追答由于数据包长度不是固定的,而且数据包也不复杂,这里就不用定义结构体了。可以按照如下方式处理(假设你的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++吧问问
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...另有一盒质量不足,轻一些。至少称几次能保证找出这盒月饼... 9盒月饼中,有一盒质量不足,至少称()次能保证找出这盒月饼 A,2 B,3... 有244盒饼干其中有一盒饼干质量不足这一核轻一些至少称几次才能保证找出... 怎么处理梭子蟹更干净? 有什么学生去西藏穷游的打卡线路分享? 小米13手机系统导航方式哪种好用 哪些公交路线可以到犀浦车管所? 19世纪末,中国面临深重的民族危机。为了挽 救民族危亡,中国人民进行... 为什么我一听伤心的歌情绪很低落。听快节奏的歌就想跳。可是室友们没... 为什么我总是听着伤心的歌就低落 实习生表格里的实习部门跟实习岗位是什么意思,该怎么填? nvidia hd音频驱动有什么用?跟 realtek hd音频驱动有什么区别? 就业见习岗位是什么意思? Realtek和NVIDIA可以同时输出吗? python 参数 解包 python参数,解包,变量! 杭州地铁1号线坐到哪个站离下沙6号大街伊比利亚电子商务园近 nivida和realtek两个声卡都需要? 华尔思bm207a怎么下载百度手机助手? GREENVILLE格林维尔港利比里亚的,西非航线。那里出口货物安全吗?有集装箱船能到吗? 利比里亚的木材运往中国的最短航线经过哪个海峡? 利比里亚的电视制式是NTSC制式还是PAL制式呢? 厄瓜多尔工业用电多少伏?也是三相四线制吗 利比里亚维和需带什么东西? 利比里亚*教学校发生火灾造成至少28人死亡,学校火灾应该怎么防范? 西非利比里亚国家使用的电源插口与中国一样吗? 怎么加日本人的QQ好友 怎么添加日本人 怎么在MSN上加日本的网友啊? 怎么添加在日本的朋友的 下载3 6 0 手机 百度 助手 我有Realtek和nvidia的两个声卡驱动,该卸载哪个? 怎么用python2.7解包文件 nVIDIA和realtek声卡驱动问题,急求!!! python中在元组解包中使用星号为什么得到的是列表? python 参数,解包,变量,中程序看不懂,我是新手,求指教。最好把正确... 药学专业毕业有哪些实习岗位 求助,求python关于socket协议打包和解包相关方法 我的声卡是Nvidia的,用驱动人生下载最新声卡驱动,显示有nvidia和realtek这样的两个驱动,我是两个都下还 毕业实习怎么找实习单位? realtek声卡驱动和nvidia音频驱动会冲突么?两者分别什么功能?可以把nvidia的音频驱动卸载吗? 在培训学校实习的实习岗位的性质和内容怎么填 在哪里可以下载百度手机助手 大学毕业 实习 工作 该如何选择 声卡型号是nvidia high definition audio和是realtek high definition audio的有什么区别? 大学实习是什么,必须要实习么,是自己找,还是学校安排? 应届毕业生想找实习机会,有哪些好的途径? 如何设置 NVIDIA与Realtek HD 不在系统托盘显示 电脑中同时存在nvidia high definition audio和realtek high definition audio 这两个有区别吗? nvidia high definition audio 和Realtek(R)Audio都显示未插入是什么原因(ps:用的是win10系统)?