全部博文(921)
分类: Python/Ruby
2012-03-13 09:57:56
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转换成字符串。
示例:
输出:
格式符"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了很久,才找到一个例子,贴出来共享一下:
关于格式字符串
在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
结论:这个模块在不同平台之间进行交互数据的时候非常重要了。可以指定格式化标准进行转换数据。然后再进行交换!