您的位置:首页 > 编程语言 > Python开发

Python模块学习 ---- struct处理二进制

2014-09-15 15:29 246 查看
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体.

struct模块中最重要的三个函数是pack(), unpack(), calcsize()

pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)

unpack(fmt, string) 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple

calcsize(fmt) 计算给定的格式(fmt)占用多少字节的内存

struct中支持的格式如下表:

FormatC TypePython字节数
xpad byteno value1
ccharstring of length 11
bsigned
char
integer1
Bunsigned
char
integer1
?_Boolbool1
hshortinteger2
Hunsigned
short
integer2
iintinteger4
Iunsigned
int
integer or long4
llonginteger4
Lunsigned
long
long4
qlong
long
long8
Qunsigned
long long
long8
ffloatfloat4
ddoublefloat8
schar[]string1
pchar[]string1
Pvoid
*
long
注1.q和Q只在机器支持64位操作时有意思

注2.每个格式前可以有一个数字,表示个数

注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串

注4.P用来转换一个指针,其长度和机器字长相关

注5.最后一个可以用来表示指针类型的,占4个字节为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

CharacterByte orderSize and alignment
@nativenative 凑够4个字节
=nativestandard 按原字节数
<little-endianstandard 按原字节数
>big-endianstandard 按原字节数
!network (= big-endian)standard 按原字节数

# -*- coding: utf-8 -*-
'''
create on:2014-09-15 14:41:11
'''
import struct

# 定义数据
a = "hello"
b = "world!"
c = 20
d = 42.56

# 打包
binStr = struct.pack("5s6sif", a, b, c, d)
print len(binStr)
binStr2 = struct.pack("i", c)

# 解包
e, f, g, h = struct.unpack("5s6sif", binStr)
print e, f, g, h

# 注意unpack返回的是tuple,如果不按规定格式书写,则返回值将改变类型
i, = struct.unpack("i", c)
print i
i = struct.unpack("i", c)
print i

# 计算转换字节长度
print struct.calcsize("5s6sif")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: