# 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)

  表示块的类。文件参数应为类文件对象。这个类的实例是特别允许的。唯一需要的方法是`read()`。如果方法`seek()`和`tell()`存在，并且不引发异常，它们也被使用。如果这些方法存在并引发异常，它们将不会改变对象。如果可选参数align为真，则假定块在2字节边界对齐。如果align为false，则不进行对齐。默认值为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参数为负或省略，读取所有数据，直到块的结束。当立即遇到块的结尾时，返回一个空字节对象。

  `skip`()

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

脚注

[1] | “EA IFF 85”交换格式文件标准，Jerry Morrison，Electronic Arts，1985年1月。