python中使用struct模块处理二进制数据

来源:转载

假设这样个场景:

你有个文件,里面全是二进制方式存储的整型,你需要读取出来。于是你随手写出了这样的代码:

1 f = open("file","rb")

2 #读取个整型

3 data = f.read(4)

4 #读取完毕,关了文件

5 f.close()6 #转换
7 num = int(data)

 然后就会报错:

 

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: null byte in argument for int()

 

你查看下data:

data = '8/x00:/x00'

 神马!!竟然是十六进制!!这货怎么转换?

你翻开《CookBook》 里面扯了一堆不着边用不到的东西,就是没有这个问题。绝望之时,你在文档里看到了struct模块,文档里这么说:

This module performs conversions between Python values and C structs represented as Python strings. It uses format strings (explained below) as compact descriptions of the lay-out of the C structs and the intended conversion to/from Python values. This can be used in handling binary data stored in files or from network connections, among other sources.

 没错,找的就是这货!

大概看了下,主要用到的是pack 函数和unpack函数。

pack:

struct.pack(fmt, v1, v2, ...) 
Return a string containing the values v1, v2, ... packed according to the given format. The arguments must match the values required by the format exactly.

 unpack:

struct.unpack(fmt, string) 
Unpack the string (presumably packed by pack(fmt, ...)) according to the given format. The result is a tuple even if it contains exactly one item. The string must contain exactly the amount of data required by the format (len(string) must equal calcsize(fmt)).

 

下面还有个对应C语言中数据类型的表格:

x pad byte no value
cchar string of length 1
bsigned char integer
Bunsigned char integer
?_Bool bool (1) hshort integer
Hunsigned short integer
iint integer
Iunsigned int integer or long
llong integer
Lunsigned long long
qlong long long (2) Qunsigned long long long (2) ffloat float
ddouble float
schar[] string
pchar[] string
Pvoid * long
Format C Type Python Notes
 怎么样?大概看明白了吧?

你把代码改成了:

f = open("file","rb")
data = f.read(4)
#转换格式
num = struct.unpack("i",data)
f.close()
print(num)

 

 这样就正常输出了吧?

嘿嘿,可以早点下班了。

 如果还不明白,就接着看文档去,还有可以参考下这篇文章:

http://www.cnblogs.com/tonychopper/archive/2010/07/23/1783501.html

 再次赞颂简洁万能的Python。


分享给朋友:
您可能感兴趣的文章:
随机阅读: