资源交换档案标准(Resource Interchange File Format) (RIFF) 是一种把资料储存在被标记的区块(tagged chunks)中的档案格式(meta-format). 它是在1991年时,由 Microsoft 和
IBM提出。它是
Electronic Arts在1985提出的 Interchange File Format的翻版。这两种标准的唯一不同处是在多位元整数的储存方式。 RIFF使用的是 小端序,这是 IBM PC 使用的处理器80x86 所使用的格式,而IFF储存整数的方式是使用大端序,这是 Amiga 和 Apple Macintosh 电脑使用的处理器,68k,可处理的整数型态。
简介
RIFF全称为资源互换文件格式(ResourcesInterchange FileFormat),RIFF文件是windows环境下大部分
多媒体文件遵循的一种文件结构,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:
音频视频交错格式数据(.
AVI)、波形格式数据(.
WAV)、位图格式数据(.RDI)、MIDI格式数据(.RMI)、
调色板格式(.PAL)、多媒体电影(.RMN)、动画光标(.ANI)、其它RIFF文件(.BND)
结构
chunk是组成RIFF文件的基本单元,它的基本结构如下:
struct chunk{u32 id; /* 块标志 */u32 size; /* 块大小 */u8 dat[size]; /* 块内容 */};
id:由4个ASCII
字符组成,用以识别块中所包含的数据。如:'RIFF','LIST','fmt','data','WAV','AVI'等等,由于这种文件结构最初是由Microsoft和IBM为PC机所定义,RIFF文件是按照little-endian
字节顺序写入的。
size(块大小):是存储在data域中数据的长度,id与size域的大小则不包括在该值内。
dat(块内容):中所包含的数据是以字(
WORD)为单位排列的,如果该数据结构长度是奇数,则在最后添加一个空(NULL)字节。
chunk块中有且仅有两种类型块:'RIFF'和'LIST'类型可以包含其他块,而其它块仅能含有数据。
'RIFF'和'LIST'类型的chunk结构如下
structchunk{u32 id; /* 块标志 */u32 size; /* 块大小 *//*此时的dat = type + restdat */u32 type ; /* 类型 */u8 restdat[size] /* dat中除type4个字节后剩余的数据*/};
可以看出,'RIFF'和'LIST'也是chunk,只是它的dat由两部分组成type和restdat。
type由4个ASCII字符组成,代表RIFF文件的类型,如'WAV','AVI ';或者'LIST'块的类型,如avi文件中的列表'hdrl','movi'。
restdat,dat中除type4个字节后剩余的数据,包括块内容,包含若干chunk和'LIST'
2.1 FOURCC 一个
FOURCC(fourcharacter code)是一个占4个
字节的数据,一般表示4个
ASCII字符。在RIFF文件格式中,FOURCC非常普遍,structchunk 中的id成员,'LIST','RIFF'的type成员,起始标识等信息都是用FOURCC表示的。FOURCC一般是四个字符,如'abcd'这样的形式,也可以三个字符包含一个空格,如'abc'这样的形式。
文件块
RIFF文件块的数据结构如下:
LIST
'LIST' ListSize ListType ListData
'LIST' 是一个
FOURCC,而且是固定的,每个LIST都是以'LIST'为开头。
ListSize 占用4个
字节,表示ListType和ListData两部分加在一起的大小。
ListType 是一个FOURCC,是对LIST具体包含的数据内容的标识。
ListData 是该LIST的数据内容区,由CHUNK和子LIST组成,它们的个数和组成次序可以是不确定的。
3. 举例
4. 总结
RIFF文件的FileData部分由若干个'LIST'和chunk组成,而'LIST'的ListData又可以由若干个'LIST'和chunk组成,即'LIST'是可以
嵌套的。
'RIFF',FileType,'LIST',ListType,ChunkID都是
FOURCC,即使用4
字节的ASIIC字符标识类型。
FileSize,ListSize,ChunkSize为little-endian32-bit正整数,表示Type(只有'RIFF','LIST'chunk有Type)+Data一起的大小,注意它是
little-endian表示,如:0x00123456,存储地址由低到高,在little-endian系统中的存储表示为0x56341200(
字节由低位到高位存储),而在big-endian为0x00123456(字节由高位到低位存储)。32bit整数0x00123456存储地址低→高little-endian(字节由低位到高位存储)56341200big-endian(字节由高位到低位存储)00123456