- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
转换到C结构或从C结构转换回来
struct模块允许创建一个等效于C结构的字符串,可以读写那些非Python程序生成的二进制文件。或者用于不同程序的网络通信。因为pickle模块的数据类型只能被Python识别。
使用struct需要使用格式字符串,调用struct.pack(format,v1,v2, ...)。格式字符如下:
字符 C类型 Python类型 c Char 长度为1的字符串 s char[] 字符串 p (pascal字符串) 字符串 i Int 整型(4) I Unsigned int 整型或长整型* b Signed char 整型 B unsigned char 整型 h Short 整型 H unsigned short 整型 l Long 整型 Long unsigned Long 长整型 f Float 浮点型 d Double 浮点型 x (pad style) - P void* 整型或长整型 带有星号的表示依赖于平台的指针是32位还是16位。
例如,如下的C结构的等价物用:
struct {
int a;
int b;
char c;
};
采用值10,20,Z,如下:
import struct
z=struct.pack(iic,10,20,Z)
z
\012\000\000\000\024\000\000\000z
从字节串反向转换用struct.unpack(format,data),返回元组:
struct.unpack(iic,z)
(10,20,Z)
传递给unpack的格式字符串一定要说明字符串中的所有数据,否则会产生异常。使用struct.calcsize(format)可以计算给定的格式字符串占用的字节数。
可以在格式字符前加上一个编号,表示这个数据类型重复的次数。为了便于理解,可以在格式字符串中的格式字符之间加入空格。
重复器编号的运行方式与s(字符串)格式字符稍有差别。重复器会告诉字符串的长度(5s意味着5个字符的字符串)。0s意味着一个空字符串,而0c意味着0字符串。
如果C的int和long的大小相同,T格式字符会把给定的编号解包为Python长整型。如果C int比C long小,T把编号转换为Python整数。
p格式字符串支持pascal字符串。这种字符串使用第一个字节存储字符串长度,所以最大长度为255字节,其余的截断。如果提供了重复器则是指定整个字符串的字节数,包含长度字节。如果字符串小于指定字节数,则pack会添加空的填充字符。
默认时,struct会把字节顺序和结构成员对齐使用当前平台的C编译器使用的格式。通过下表列出的某个修饰符启动自己的格式字符串,可以超越这种行为。例如使用网络序:
struct.pack(ic,65535,D) #本机字节序为高序优先
\377\377\000\000D
struct.pack(!ic,65535,D) #强制网络字节序
\000\000\377\377D
修饰符
字节顺序
对齐
大小
高序优先(little-endian) 无 标准 或! 低序优先(网络) 无 标准 = 内在的 无 标准 @(默认) 内在的 内在的 内在的 当使用了一个大小为standard的修饰符,则C short会占据2个字节,int、long、float将使用4个字节,double使用8个字节。
如果需要使用对齐,而又不想用@(内在的对齐)时,可用x格式字符插入填充字节。如果必须强制一个结构的末端依据特殊类型的对齐规则进行对齐,则可用这种类型的格式代码(计数值为0)。如下例子强制单字符的结构对齐整型边界:
struct.pack(c,A)
A
struct.pack(c0l,A)
A\000\000\000
P(指针)格式字符只能在本地赋值中使用。
可用struct模块读写二进制文件,比如提取.wav文件的前36个字节的文件信息头。内容如下:
RIFF(4字节),用于识别文件类型
高序优先的长度字段(4字节)
WAVE(4字节),用于识别文件类型
fmt (4字节)
格式定义的子数据块长度(4字节)
格式类型(2字节)
声道数(2字节)
采样频率/Hz(4字节)
每秒数据量/字节(4字节)
样本字节数/字节(2字节)
声道宽度/位(2字节)
表示标题的格式字符串:
4s i 4s 4s ihhiihh
如下是提取WAV文件头信息的例子:
s=open(c:\\winnt\\media\\ringin.wav,rb).read(36)
struct.unpack(4si4s4sihhiihh,s)
(RIFF,10018,WAVE,fmt ,16,1,1,11025,1
文档评论(0)