def setUTF(self, value):

"""

"""

tag = '>h' if self.endian == HIGHT_ENDIAN else 'h'

length = len(value)

self.buffer += (struct.pack(tag, length))

tag = '%ss' % (length)

self.buffer += (struct.pack(tag, value))

return True

还是不能理解好pack,有人可以帮忙回答下不

因为涉及二进制串和字节处理,所以包含的知识是比较底层的。首先要知道 struct 中的 pack 和 unpack 是用来完成数据结构和字节流之间转换的,也就是说,这两个函数是在转换数据的表示形式,并不会改变数据。

比如 int a = 4; 这里的 a 转换通过'i' format 成字节流为: \x04\x00\x00\x00 (大端序为 \x00\x00\x00\x04)。

以上或者反过来。

那么简洁地说:为什么要转换?

为了迎合处理字节流,比如 构造网络包来发送,或者解析接收的网络包。

怎么转?

这就是函数(主要就是 pack 和 unpack)的使用方法。 pack(format, value1, value2...) unpack(format, string)

其中:

pack函数将普通的数据结构转成字节流,你自然要提供一个 format, 这个 format 描述了你要操作的后面许多value的数据类型,从而按照这个描述生成的有意义的字节流。 而 接收到的字节流 或者 之前生成的字节流,可以通过unpack函数来解析,一大段字节来了,你要解析,自然需要描述一下这个字节流我该在哪里切分一下,应该用什么顺序等,这就是format在做的事情。

format 该怎么写?

请自行查询这里 format 的语法。

特别的,由于系统本身处理字符串的差异,在描述数据类型的format参数的开头,也可能有(可缺省)描述format方式的符号(比如字节顺序),具体同format 语法,请自行查询。

所以,我们来看你的这段代码:1.代码中的tag,即为 format 变量。

tag = '>h' if self.endian == HIGHT_ENDIAN else 'h'

这里通过判断 字节顺序,来判断是否添加 大端字节序描述符‘>’ 到format前,'h'在format语法中代表 2字节长度的 C语言 short类型(Python中的 integer )。

2. 保存value长度

length = len(value)

self.buffer += (struct.pack(tag, length))

求的value的长度,现在的tag值为“h”或者“>h”, 来表示长度length, 调用函数生成字节流添加到buffer的尾端。

3. 保存value的值

tag = '%ss' % (length)

self.buffer += (struct.pack(tag, value))

先生成描述value的format,然后pack,添加到buffer尾端。

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19037.html

相关文章 Recommend

python中pack什么意思_Python struct.pack如何理解其原理相关推荐

  1. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  2. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  3. python struct pack解析_python struct pack

    这个struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~ 一般输入的渠道来源于文件或者网络的二进制流. 在 ...

  4. python中doc=parased.getroot()_python实例手册.py

    python实例手册 #encoding:utf8 # 设定编码-支持中文 0 说明 手册制作: 雪松 littlepy www.51reboot.com 更新日期: 2016-01-21 欢迎系统运 ...

  5. python中stringvar的用法_Python tkinter.StringVar方法代码示例

    本文整理汇总了Python中tkinter.StringVar方法的典型用法代码示例.如果您正苦于以下问题:Python tkinter.StringVar方法的具体用法?Python tkinter ...

  6. python中的匿名函数_python匿名函数

    文章导读: 以前自己一直没搞明白Python中的匿名函数,现在拿这个问题基本上搞明白了,拿自己的理解整成一篇文章,附带大量例子,让其更加好理解. 在编程语言中,函数的应用: 1. 代码块重复,这时候必 ...

  7. python中垃圾回收机制_python 垃圾回收机制

    首先我们要说是 以引用计数为主 标记清楚和分代回收为辅 接下来分以下几个方面解释 一 引用计数 每个对象内部都维护了一个值,该值记录这此对象被引用的次数,如果次数为0,则Python垃圾回收机制会自动 ...

  8. python中char是什么_python有char类型吗

    python没有char类型,一个字符也是字符串. 为什么在Python中没有专门的char数据类型呢? 简单胜于复杂.在 Python 中, 字符串中的每个字符占的空间大小是 8 bit.>& ...

  9. python中的帮助系统_python系统模块

    Python中大多数系统接口都集中在两个模块:sys和os.这么说有点过于简单化 还有一些其他的表转模块也属于这个领域他们包括: glob 用于文件名的扩展 socket 用于网络连接和进程间通信(I ...

最新文章

  1. 知乎千万级高性能长连接网关是如何搭建的
  2. kill qz _e epi,eu,ex,exo out3
  3. java状态模式所有情况_轻松掌握Java状态模式
  4. 【maven】mvn -pl 指定模块
  5. GDUFE ACM-1045
  6. 基于vue2+nuxt构建的高仿饿了么(2018版)
  7. 格式化代码php,格式化php代码的两种方法
  8. svn主干开辟分支、分支合并到主干
  9. PyTorch学习—19.模型的加载与保存(序列化与反序列化)
  10. python notebook右侧网页_Python Notebook介绍
  11. 初学者小白怎么画猫咪主题插画?该怎么去注意其中的细节?
  12. 朋友圈集赞神器 | 1秒集齐300个赞,从此点赞不求人
  13. SC0095-AT32F437使用USB挂载SD卡作为U盘使用
  14. 今日凌晨Vue3 beta版震撼发布,竟然公开支持脚手架项目!
  15. 关于win10无法打开.msi文件的解决方法
  16. 最少的脚本实现在NSH脚本作业中加入动态参数
  17. 初学Python-反射 装饰器 面向对象编程 异常处理 断言
  18. Java Excel文件内容替换
  19. 演讲实录丨朱频频 让Bots无处不在
  20. Python基础:面向对象编程实战——简易图书管理系统

热门文章

  1. 同一个controller中同一个service不同的方法调用怎么有的会为null
  2. 中国半导体芯片产业布局图(2022版)-爱普搜汽车
  3. 剑指 Offer 46. 把数字翻译成字符串
  4. json解析 C# json解析
  5. 机器学习中算法与模型的区别
  6. 18届清华硕士狂拿18家互联网公司sp offer总结
  7. 淘宝号标签,,猜你喜欢推荐,消费潜力值,淘宝号的千人千面,购物足迹,潜在购买类目,淘宝号的潜在成交词,官方推荐的搜索词,淘宝标签查询,淘宝号是否打上标签,标签透视,标签接口,猜你喜欢接口,
  8. Hibernate QBC与QBE
  9. react项目中在线预览附件
  10. Echarts绘制不均匀数据轴(y)