`
wwty
  • 浏览: 536651 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

struct的pack和unpack方法

阅读更多

这两天做TCP协议,数据的传输都是二进制的,需要解释,于是用到了struct
看到这样一句代码:
  

length = struct.unpack('>I', self.buffer[:4])[0]

 当时没有明白format=">I"是什么意思,从google找了一下,有人说这个东西,可都是比较笼统,没能让我明白,于是硬着头皮看API:
By default, C numbers are represented in the machine’s native format and byte order, and properly aligned by skipping pad bytes if necessary (according to the rules used by the C compiler).
通常,C语言下数字都是机器语言的格式并且按照字节排序,同时在需要的情况下会利用跳过填补的字节来进行适当的调整

 

Alternatively, the first character of the format string can be used to indicate the byte order, size and alignment of the packed data。
非此即彼:字符串的第一个字符要么被用于表示字符串的字节的排序,或者是字符串的size,还有就是数据是否对准。


 

Native byte order is big-endian or little-endian, depending on the host system. For example, Motorola and Sun processors are big-endian; Intel and DEC processors are little-endian.
计算机的字节序要么是高位顺序,要么是低位的,这依赖于主机本身。比如,摩托罗拉和sun的处理器是高位的,但是intel和DEC的是低位的。

 

这样子就明白了上面的format=">I"的意思,也就是说按照高位顺序来格式化取得一个int或long值。下面问题就又来了,你怎么知道读取的就是一个int或long值呢?

通过看struct的文档,可以看到struct通过两张表制定了一定的format规则,我按照自己的观察,给他归纳为两类,一个是和C当中类型的对照,另一个就是选择按照高位还是低位来解释字节。上面已经说了高低字节顺序,那么观察和C对照的表格,发现I 代表的就是integer or long ,详细的可以去看python的API。

 

下面是一些使用的例子,具体的使用,可以参考这些例子:
1. 设置fomat格式,如下:
# 取前5个字符,跳过4个字符华,再取3个字符
format = '5s 4x 3s'

2. 使用struck.unpack获取子字符串
import struct
print struct.unpack(format, 'Test astring')
#('Test', 'ing')
来个简单的例子吧,有一个字符串'He is not very happy',处理一下,把中间的not去掉,然后再输出。
import struct
theString = 'He is not very happy'
format = '2s 1x 2s 5x 4s 1x 5s'
print ' '.join(struct.unpack(format, theString))
输出结果:
He is very happy

 

 

随后是关于网络字节的东东,从网上看来的,感觉有用:

Python的socket库采用string类型来发送和接收数据,这样当我们用
i = socket.recv(4)
来接收一个4字节的整数时,该整数实际上是以二进制的形式保存在字符串 i 的前4个字节中;大多数的时候我们需要的是一个真正的integer/long型,而不是一个用string型表示的整型。这时我们可以使用struct库:Interpret

strings as packed binary data. 对上面的情况,我们可以写
t = unpack("I", i)
第一个参数是格式化字符串,I指明字符串 i 包含的头一个数据项是一个以C语言的unsigned integer表示的整数,这里 i 只包含了一个数据项,实际上这个被解释的字符串也可以包含多个数据项,只要在格式化字符串里为每项数据指明一个格式即可;自然地,unpack返回的就是一个tuple类型了。

  • 大小: 20.5 KB
分享到:
评论

相关推荐

    Python使用struct处理二进制(pack和unpack用法)

    struct模块中最重要的三个函数是pack(), unpack(), calcsize() # 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回...

    Python中的pack和unpack的使用

    int 既可以是有符号的,也可以是无符号的,这样一来 Python 和 Go 在处理同样大小的数字时存储方式就有了差异。 除了语言之间的差别,不同的计算机硬件存储数据的方式也有很大的差异,有的 32 bit 是一个 word,有的...

    Python使用struct处理二进制的实例详解

    struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, …) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string) 按照给定的格式(fmt)解析...

    php读取二进制流(C语言结构体struct数据文件)的深入解析

    不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转:复制代码 代码如下:string pack ( string $format [, mixed $args [, mixed $…]] ) //Pack given arguments into binary ...

    PHPStruct:Python的struct模块PHP实现

    pack和unpack格式字符串的语法与python的struct模块中的语法相同。 解压缩的结果是正常的数字索引数组,应从0开始像它应该的那样。 unpack的结果具有类型转换值(对于整数格式为int,对于布尔格式为bool,对于...

    使用Python进行二进制文件读写的简单方法(推荐)

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制...a,=struct.unpack(‘i’,byte

    PRakNet:低级raknet实施

    PRakNet 低级raknet实施安装: ... 128 + pos[0]) + struct.pack(">f", 64 + pos[1]) + struct.pack(">f", 128 + pos[2])def decode_pos(pos): return [struct.unpack(">f", pos[:4])[0] - 128, struct.unpack(">f",

    python读写二进制文件的方法

    在网上查到一篇贴子,使用struct模块里面的pack和unpack函数进行读写。下面就自己写代码验证一下。 >>> from struct import * >>> file = open(rc:/debug.txt, wb) >>> file.write(pack(idh, 12

    rawpacker:Godot的RawArray packerunpacker

    该方法的灵感来自Python的struct.pack和struct.unpack函数。 打包/解包RawArray对于以紧凑形式发送和存储数据很有用。安装只需将rawpacker目录放到rawpacker godot/modules目录中,然后为您选择的平台构建即可。...

    Python开发实例分享bt种子爬虫程序和种子解析

    复制代码 代码如下: #encoding: utf-8 import socket from hashlib import sha1 from random import randint from struct import unpack, pack from socket import inet_aton, inet_ntoa from bisect import ...

    学习笔记(13):Python网络编程&并发编程-解决粘包问题-终极版本

    2)struct模块中struct.pack(‘l’,数据长度),这个数据长度是有限制的,当发送的文件的字节数长度超过时,就会出现错误! 2.知识点 1)字典转为bytes类型:首先使用json.dumps(dict)将字典序列化为json字符串,然后...

    python二进制文件的转译详解

    pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple unpack(fmt, string) # 计算给定的格式(fmt)占用多少字节的内存 calcsize(fmt) 例如:我需要读取一个名为filename,存放着形状...

    pwntools-tutorial:Pwntools入门教程

    Pwntools旨在以半标准方式提供所有这些功能,以便您可以停止将同一struct.unpack('>I', x)代码粘贴到周围,而使用更清晰的包装器,例如pack或p32或甚至p64(..., endian='big', sign=True) 。 除了围绕普通功能的...

    xdr:具有各种语言后端的 XDR 代码生成器

    struct foo { int a; string b<>; }; 您可以像这样生成 Python 代码: xdr -t python -o myxdr myxdr.x 然后在 Python 程序中: import myxdr x = myxdr.foo(a=1, b="bar") data = x.pack() y = myxdr.foo...

    Python二进制文件读取并转换为浮点数详解

    主要介绍了Python二进制文件读取并转换为浮点数详解,用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要是unpack、pack、calcsize。,需要的朋友可以参考下

    opengl的太阳系模型

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //对齐像素字节函数 glGenTextures(1,texName); //第一个参数指定表明获取多少个连续的纹理标识符 glBindTexture(GL_TEXTURE_2D , *texName); glTexParameterf(GL_...

Global site tag (gtag.js) - Google Analytics