python小点心--struct 封装变长字符串
来源:互联网 发布:php表格代码 编辑:程序博客网 时间:2024/04/30 14:32
使用struct,可以非常方便的处理二进制数据,将常用的int,string等类型的数据转成二进制数据,它有两个重要函数,一个是pack,一个是unpack
先看一张表
struct中支持的格式如下表:
来看一个简单的例子
def demo(): string = struct.pack('ii4s',3,4,'test') a1,a2,a3 = struct.unpack('ii4s',string) print a1,a2,a3
这个小小的例子,已经把struct的功能完美的诠释了,对照着上面的图表,我们可以将任何类型的数据转换成二进制数据
但是有两点还是要强调说明一下:
(1) pack 返回的是字符串
(2) unpack返回的是tuple
在实际应用中,我们可以用其将数据保存到二进制文件中,比如个人信息:name,age,address
我们将一个人的个人信息转成二进制数据保存到一个二进制文件中,然后在需要的时候将其取出。现在好好思考一下这个问题,假设有一百条个人信息,每条个人信息都包含name,age,address,我们需要将他们写入到二进制文件中,但是得确保他们一个挨着一个,而且转化后的二进制数据应该是等长的,这样读取的时候才能逐条的读取个人信息。age是年龄,可以用一个int来表示,一个int占4个byte,但name和address都不是定长的,所以需要给他们一个固定的长度,为了简单,我们要求name的长度最大为10byte,address的最大长度为60byte。这样,一个人的个人信息就可以用74byte来表示。pack的第一个参数可以这样来写‘i10s60s’。
这样子写是没有问题的,但是读的时候就有麻烦了,我们为name分配了10个byte,但可能最终只用了6个byte或9个byte来保存name的二进制数据,读取时,使用unpack,得到的是10个byte组成的字符串,这样一来就不清楚name的真实值是什么。
现在,需要一种可以封装变长string的方法。为name分配15个byte,前4个byte用来记录name的长度,剩下的11个byte用来保存name的二进制数据
设计两个函数,一个用来封装变长string,一个用来解封string
#coding=utf-8'''Created on 2016-3-7@author: Administrator'''import struct block = 15def struct_str(string): length = len(string) if length>block-4: return False,None length_str = struct.pack('i',length) new_str = length_str+string str_pack = struct.pack(str(block)+'s',new_str) return True,str_packdef get_struct_str(string): length = struct.unpack('i',string[0:4])[0] str_content = struct.unpack('{length}s'.format(length=length),string[4:4+length])[0] print str_content
if __name__ == '__main__': state,str = struct_str('非常好') get_struct_str(str)
注意,传入的string是‘非常好’ ,如果传入u'非常好' 是会报错的,因为pack要求传入字符串
- python小点心--struct 封装变长字符串
- struct 封装变长字符串
- python小点心--set
- python小点心--globals函数
- python小点心--__call__
- python小点心--list 排序
- python小点心--Event
- python小点心--compile
- python小点心--filter函数
- python 小点心 --datetime(日期)
- python 小点心---execvp
- python小点心--内存文件映射
- python小点心-logging 日志模块
- python小点心--判断操作系统类型
- python 小点心---requests 和 https
- struct 变长数组
- 初学Python字符串封装
- python小点心--获取汉子拼音首字母
- Apache Shiro 使用手册(三)Shiro 授权
- android WebView 与javaScript交互
- C# WINFORM 捕获最小化事件
- Android入门:Activity四种启动模式
- jdk 安装
- python小点心--struct 封装变长字符串
- 关于windows server 2003服务器搭建正式dedecms运行环境的问题
- smarty使用
- Apache Shiro 使用手册(四)Realm 实现
- 如何分辨内网ip和外网ip
- 细说mybatis的缓存机制
- recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);/函数简单了解
- Android应用是否可以只有一个Service或Broadcast Reciver,而没有Activity?
- Oracle 查询一个月内的活动