网站大量收购闲置独家精品文档,联系QQ:2885784924

python.转换到C结构或从C结构转换回来.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

ktj823 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档