python处理二进制数据,读(解包),写(打包)
转自:http://muxu303.blog.163.com/blog/static/51280192011224101232405/
python作为脚本语言中最给力的一种,集成了编译语言的功能性和脚本语言的灵活性,作为一种高级的解释性脚本语言,同时还具有程序语言的各种优点如:面向对象,可扩展,可移植,易学易用,强大的内存管理,有点少叙,本文介绍其对二进制数据的操作模块struct,无论是网络应用,还是文件存储,均可派上用场..
先来感性的认识一段代码:如下(输出为斜体)
?
--------------------------------------------
>>> import struct? 【引入struct包】
>>> byte_buf = struct.pack("i5sc6s", 9527,"hello"," ","world!!") ?【打包数据到byte_buf中,参数“i5sc6s”表示一个int型,长度为5的char组...】
>>> v1,v2,v3,v4 = struct.unpack("i5sc6s",byte_buf) 【解包到四个值】
>>> print v1,v2,v3,v4 【打印输出】
9527 hello ? world! ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 【最后一个感叹号没打印出来,因为格式化参数“i5sc6s“的6截断第二个感叹号】
--------------------------------------------
?
?
>>> byte_buf = struct.pack("i", 134) ?? 【只对一个值打包】
>>> type(struct.unpack("i", byte_buf)) ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 【unpack返回的是tuple】
?
<type 'tuple'>
>>> struct.unpack("i", byte_buf)[0] ?? ?
134
通过如上的演示,相信大家对该模块的用法已经掌握了,如下两表为该模块对应的,格式化时使用的数据类型,和一些特殊规则
?
?
FormatC TypePython字节数xpad byteno value1ccharstring of length 11bsigned?charinteger1Bunsigned?charinteger1?_Boolbool1hshortinteger2Hunsigned?shortinteger2iintinteger4Iunsigned?intinteger or long4llonginteger4Lunsigned?longlong4qlong?longlong8Qunsigned?long?longlong8ffloatfloat4ddoublefloat8schar[]string1pchar[]string1Pvoid?*long4?
考虑到c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而还提供了如下的选项用来表示不同的字节对其方式,如使用'@6si'表示4字节对齐,先6个char,再一个int型,共使用12个字节
?
CharacterByte orderSize and alignment@nativenative ? ? ? ? ? ?4个字节对齐=nativestandard ? ? ? ?原字节数<little-endianstandard ? ? ? ?原字节数>big-endianstandard ? ? ? 原字节数!network (= big-endian)standard ? ? ? 原字节数