Skip to main content

22.5. chunk —读取IFF分块数据

源代码: Lib/chunk.py


此模块提供用于读取使用EA IFF 85块的文件的接口。 [1] 此格式至少用于音频交换文件格式(AIFF/AIFF-C)和真实媒体文件格式(RMFF)。 WAVE音频文件格式是密切相关的,也可以使用此模块读取。

块具有以下结构:

抵消

长度

内容

0

4

块ID

4

4

块大小按big-endian字节顺序,不包括头

8

n

数据字节,其中 n 是前一字段中给出的大小

8 + n

0或1

如果 n 为奇数并且使用块对齐,则需要填充字节

ID是一个4字节的字符串,用于标识块的类型。

大小字段(32位值,使用大尾数字节顺序编码)给出了块数据的大小,不包括8字节头。

通常,IFF类型的文件由一个或多个块组成。这里定义的 Chunk 类的建议使用是在每个块的开始处实例化一个实例,并从实例中读取,直到它到达结束,之后可以实例化一个新的实例。在文件结尾处,创建新实例将失败并出现 EOFError 异常。

class chunk.Chunk(file, align=True, bigendian=True, inclheader=False)

表示一个块的类。 file 参数应该是一个类文件对象。特别允许这个类的实例。唯一需要的方法是 read()。如果方法 seek()tell() 存在并且不引起异常,也使用它们。如果这些方法存在并引发异常,则它们不会改变对象。如果可选参数 align 为真,则假定块在2字节边界上对齐。如果 align 为假,则不假定对齐。默认值为true。如果可选参数 bigendian 为假,则块大小假定为小端顺序。这是WAVE音频文件所需要的。默认值为true。如果可选参数 inclheader 为真,则块头中给出的大小包括头的大小。默认值为false。

Chunk 对象支持以下方法:

getname()

返回块的名称(ID)。这是块的前4个字节。

getsize()

返回块的大小。

close()

关闭并跳到块的结尾。这不会关闭底层文件。

如果在调用 close() 方法后调用,剩余的方法将引发 OSError。在Python 3.3之前,他们习惯于提高 IOError,现在是 OSError 的别名。

isatty()

返回 False

seek(pos, whence=0)

设置块的当前位置。 whence 参数是可选的,默认为 0 (绝对文件定位);其他值是 1 (相对于当前位置的搜索)和 2 (相对于文件的结尾搜索)。没有返回值。如果底层文件不允许seek,则只允许前向寻道。

tell()

将当前位置返回到块。

read(size=-1)

从块中读取最多 size 个字节(如果读取在获取 size 字节之前命中块的末尾,则更少)。如果 size 参数为负或省略,请读取所有数据,直到块的结尾。当立即遇到块的结尾时,返回一个空字节对象。

skip()

跳到块的结尾。对 read() 的所有进一步调用将返回 b''。如果您对块的内容不感兴趣,应该调用此方法,以便文件指向下一个块的开始。

脚注

[1]

“EA IFF 85”Standard for Interchange Format Files,Jerry Morrison,Electronic Arts,1985年1月。