Python Unpack 处理网络字节流

这篇具有很好参考价值的文章主要介绍了Python Unpack 处理网络字节流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python struct 包中有pack和unpack 可以处理与C语言对应的数据,详细参考:https://blog.csdn.net/weiwangchao_/article/details/80395941

如果C/C++/C#端发送网络字节流中包含字符串,Python用unpack解析接收到的网络字节流时,可能会遇到字节对齐的问题。

比如, 下图中msg[4]是从网络中接收到的一个数据包,截图中是以16进制数据呈现的,可以用在线进制转化工具来查看十进制下的数值。

Python Unpack 处理网络字节流

事实上,以上数据正确解析结果应该是:

Python Unpack 处理网络字节流红色竖线之间包含4个十六进制的数据,每个十六进制的数据代表一个字节,字符串每个元素占1个字节,可以算出上图中msg[4]总共有44个字节。 

Python Unpack 处理网络字节流

 注意到,数据开头是一个逗号,ASII码值是44,正好就是上图解析出来的包头长度44。

Python Unpack 处理网络字节流

 第二段数据是消息类型,xe9\x03\x00\x00 ,借助上面提到在线进制转换工具,可以看到十进制数值是1001,与正确解析结果相吻合。

注意:我的网络数据流采用大端模式,因此低位地址存放高字节,高危地址存放低地址,所以十进制转化时输入的是03e9而不是e903。

 Python Unpack 处理网络字节流

 注意到,unpack解析时,fmt中开头是=,查阅资料可知,=意味着按照网络原字节解析,即解析时不考虑字节对齐,按照用户输入大小'=3i 5s 4i 11s'直接解析。

Python Unpack 处理网络字节流

 如果把fmt内容替换为'3i 5s 4i 11s',即去掉等号,那么解析出错

Python Unpack 处理网络字节流

 i代表int, 4字节,1个s占个字节

那么,fmt指定的大小为 3i 5s 4i 11s=3*4+5+4*4+11=44,这与msg中总字节数完全一致。但是fmt去掉等号之后,考虑字节对齐,要求有47个字节,比实际多了3个字节。

原因:5s夹在3i和4i之间,前三个int应该能正确解析,解析字符串01-98的时候,由于字符串本身是5个字节,对齐到4字节的话,要用8个字节来存这个数据,刚好比实际多3个字节。

将msg[4]中的数据拷贝出来,在01-98后面填三个空字节,fmt内容不变,再解析,成功。

Python Unpack 处理网络字节流

 那么,位于msg[4]末尾的Hello World本身占11个字节,如果字节对齐的话,应该也要加1个字节,为什么这里没有加,仍然能正确解析? 

根本原因尚不清楚,但是猜测只要字符串后面没有其他数据,就不会有问题,下面印证一下

在Hello World后面加个int。

fmt_test = 3i5s4i11si=3*4+5+4*4+11+1*4=48, 由于已经给01-98后面加了三个空字节,所以test实际大小是51字节,报错提醒要52字节。

Python Unpack 处理网络字节流

 由于Hello World占11个字节,内存对齐到4字节的话,额外需要1个空字节,51+1=52刚刚好。下图可以看到hello World后加一个空字节后,解析正确。

Python Unpack 处理网络字节流

如果把所有手动加入的空字节去掉,仍然想正确解析,就在 fmt内容前加等号,即按照fmt给定的数据类型和长度解析,效果见文章开头正确解析的案例。文章来源地址https://www.toymoban.com/news/detail-404475.html

到了这里,关于Python Unpack 处理网络字节流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中struct 模块的使用教程

    1.struct 简单介绍 struct 是 Python 的内置模块, 在使用 socket 通信的时候, 大多数据的传输都是以二进制流的形式的存在, 而 struct 模块就提供了一种机制, 该机制可以将某些特定的结构体类型打包成二进制流的字符串然后再网络传输,而接收端也应该可以通过某种机制进行解包还原

    2023年04月11日
    浏览(25)
  • python中有哪些运算符,python里的运算符号

    大家好,给大家分享一下python中有哪些运算符,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 1. 比较运算符: 如果比较式成立,返回True;不成立,则返回False。 常见的比较运算符如下: 除了简单的两值相比之外,比较运算符还支持比较复杂的比较。 (

    2024年02月07日
    浏览(46)
  • 【OpenCV实现图像:用Python生成图像特效,报错ValueError: too many values to unpack (expected 3)】

    Python是一种功能强大的编程语言,也是图像处理领域中常用的工具之一。通过使用Python的图像处理库(例如Pillow、OpenCV等),开发者可以实现各种各样的图像特效。这些特效包括但不限于:滤镜效果(如黑白、模糊、锐化等)、颜色转换、边缘检测、形状识别、图像合成和增

    2024年02月06日
    浏览(43)
  • python查看列表中有多少个元素

    要查看列表中的元素数量,你可以使用 Python 的内置函数 len() 。 len() 函数返回给定序列(如列表)的元素数量。 以下是一个示例代码: 输出: 在上述示例中,我们有一个名为 my_list 的列表,使用 len(my_list) 来获取列表中的元素数量。将返回的结果存储在变量 length 中,并打

    2024年02月03日
    浏览(41)
  • Python 中有可以查看 pip 版本的方法

    在Python中,pip是一个包管理器,用于安装和管理Python包。要查看pip的版本,可以使用几种不同的方法,这些方法适用于不同的使用场景和需求。 1. 使用pip命令行工具 pip本身提供了一个命令行接口,可以用来执行各种操作,包括查看版本信息。要查看pip的版本,可以在命令行

    2024年04月11日
    浏览(49)
  • python中有哪些你觉得超级牛的模块?

    之前在做数据分析的时候,用过一个自动化生成数据探索报告的Python库: ydata_profiling 一般我们在做数据处理前会进行数据探索,包括看统计分布、可视化图表、数据质量情况等,这个过程会消耗很多时间,可能需要上百行代码才能实现。 ydata_profiling能够直接完成数据探索的

    2024年02月06日
    浏览(43)
  • 解决:Python通过pip安装库时报错:ERROR: Cannot unpack file ...; ERROR: Cannot determine archive format of ...

    在使用之前的代码时,报错: ERROR: Cannot unpack file C:UsersMatchaAppDataLocalTemppip-unpack-qdrm7q1esimple.htm (downloaded from C:UsersMatchaAppDataLocalTemppip-req-build-xkgrt0zv, content-type: text/html); cannot detect archive format ERROR: Cannot determine archive format of C:UsersMatchaAppDataLocalTemppip-req-build-xkgrt0

    2024年02月04日
    浏览(47)
  • 【全民Python】 Python网络通信UDP消息收发处理

    目录 一.UDP介绍 二.UDP的使用方法 三.源码 1. UDP的英文单词是User Datagram Protocol,缩写为UDP,是一种用户数据报协议,又称为用户数据报文协议,是一种报文的协议,是一个简单的面向数据报的传输层协议  。 2.UDP的发起和接受是不需要经过连接的,仅仅只需要发送在对应端口

    2024年02月15日
    浏览(35)
  • Python处理HTTP响应的常用技巧:驯服网络野兽的艺术

    在网络世界里,HTTP响应就像是一只难以捉摸的野兽。它时而温顺,提供你想要的数据;时而暴躁,给你一个404或500的错误码。作为Python程序员,我们的任务就是驯服这只野兽,从中提取出有价值的信息。今天,就让我们来探讨一下驯服网络野兽的常用技巧吧! 1. 捕获响应内

    2024年02月20日
    浏览(39)
  • Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    卷积神经网络,也叫 CNN ,它是计算机视觉应用几乎都在使用的一种深度学习模型。我们都知道,成功提取显著相关的特征是保障任何机器学习的算法成功的保障,传统的机器学习模型依赖领域专家的输入特征,或者基于计算特征的提取技术。神经网络能够自动地从原始数据

    2024年02月03日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包