Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5013882
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2012-03-13 09:57:56

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转换成字符串。

示例:

  1. #-*- coding:utf-8 -*-

  2. import struct

  3. a = 20

  4. b = 400

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

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

  7. print str

  8. print repr(str)

 

输出:

  1. #---- result
  2. #length: 8
  3. # ----这里是乱码
  4. #'\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. #! /usr/bin/env python
  2. #coding=utf-8
  3. import struct from ctypes
  4. import create_string_buffer
  5. buf = create_string_buffer(12)
  6. print repr(buf.raw)
  7. struct.pack_into("iii", buf, 0, 1, 2, -1)
  8. print repr(buf.raw)
  9. print struct.unpack_from('iii', buf, 0)

  10. #---- result
  11. #'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  12. #'\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff'
  13. #(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

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


 

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