Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30238844
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2010-06-10 12:44:28

pythonstruct模块

时间:2010-6-10

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

现在问题来了?

当我用python C++进行交互的时候。比如说我用C++传输过来一个int(4字节)pythonsocket服务器。那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个字节,两个int8个字节),可以 看到输出的结果是乱码,因为结果是二进制数据,所以显示为乱码。可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的 0x00000014, 0x00001009分别表示20400

 

将其按照指定的格式进行打包这样就成为一个二进制数据了。要查看二进制数据的话可以用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)  

关于格式字符串

  在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

 

 

 

 

 

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

 

阅读(587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~