文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>python中struct模块

python中struct模块

时间:2010-06-10  来源:hkebao

python中struct模块

时间:2010-6-10

Python提供的数据类型只包含六种:字符串、整数、浮点数、元组、列表、字典

现在问题来了?

当我用python 与C++进行交互的时候。比如说我用C++传输过来一个int(4字节)到python的socket服务器。那python是如何认识它呢?即如何解决这种跨平台调用的情况!

解决方案:使用struct模块进行解决!

struct.pack

这个家伙的作用:将python的值根据格式符转换为字符串。(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)其实字符串在JAVA里面是可以与字符数组相互转换的。String a=char[]

struct.pack(fmt, v1, v2, ...),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, ...表示要转换的python值。

说明:依据这个格式化字符fmt转换成字符串。

 

示例:

#-*- coding:utf-8 -*-

import struct

a = 20

b = 400

str = struct.pack("ii",a,b)   #依据这种指定的格式进行打包转换

print "length is ",len(str)  #这个其实就是一个字符串

print str

print repr(str)

 

输出:

#---- result  

#length: 8  

#    ----这里是乱码  

#'\x14\x00\x00\x00\x90\x01\x00\x00'  

 

格式符"i"表示转换为int,'ii'表示有两个int变量。进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节),可以 看到输出的结果是乱码,因为结果是二进制数据,所以显示为乱码。可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的 0x00000014, 0x00001009分别表示20和400。

 

将其按照指定的格式进行打包这样就成为一个二进制数据了。要查看二进制数据的话可以用repr来处理!

 

 

 

 

 

struct.unpack

刚好与上面的打包过程相反。把二进制拆包成字符串!

a1, a2 = struct.unpack("ii", str)             按照打包的格式再进行一次拆包处理!

print a1

 

struct.calcsize

  struct.calcsize用于计算格式字符串所对应的结果的长度,如:struct.calcsize('ii'),返回8。因为两个int类型所占用的长度是8个字节。

 

PS:这个东西的作用应该是返回这个格式化的长度了!

struct.pack_into, struct.unpack_from

   这两个函数在Python手册中有所介绍,但没有给出如何使用的例子。其实它们在实际应用中用的并不多。Google了很久,才找到一个例子,贴出来共享一下:

1.        import struct  

2.        from ctypes import create_string_buffer  

3.          

4.        buf = create_string_buffer(12)  

5.        print repr(buf.raw)  

6.          

7.        struct.pack_into("iii", buf, 0, 1, 2, -1)  

8.        print repr(buf.raw)  

9.          

10.     print struct.unpack_from('iii', buf, 0)  

11.       

12.     #---- result  

13.     #'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'  

14.     #'\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff'  

15.     #(1, 2, -1)  import struct from ctypes import create_string_buffer buf = create_string_buffer(12) print repr(buf.raw) struct.pack_into("iii", buf, 0, 1, 2, -1) print repr(buf.raw) print struct.unpack_from('iii', buf, 0) #---- result #'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' #'\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff' #(1, 2, -1)

关于格式字符串

  在Python手册中,给出了C语言中常用类型与Python类型对应的格式符:

格式符

C语言类型

Python类型

x

pad byte

no value

 

c

char

string of length 1

 

b

signed char

integer

 

B

unsigned char

integer

 

?

_Bool

bool

 

h

short

integer

 

H

unsigned short

integer

 

i

int

integer

 

I

unsigned int

integer or long

 

l

long

integer

 

L

unsigned long

long

 

q

long long

long

 

Q

unsigned long long

long

 

f

float

float

 

d

double

float

 

s

char[]

string

 

p

char[]

string

 

P

void *

long

 

 

 

 

 

结论:这个模块在不同平台之间进行交互数据的时候非常重要了。可以指定格式化标准进行转换数据。然后再进行交换!

 

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载