.CSO

CSO,又称CISO(源自英文Compressed ISO的缩写),是一种计算机文件格式,由经过压缩后的ISO映像产生。[1]其是首个为了压缩ISO映像而开发出来的方案,常被用于压缩PS2以及PSP平台上的ISO文件,以降低存储空间上的压力。此外,为了优化该格式的资料压缩比以及解压速度等问题,该格式经历过了数次修改与迭代,产生了诸如CSO v2DAXJSOZSO等格式。

压缩版ISO映像
扩展名.cso
互联网媒体类型application/x-compressed-iso
魔术数字'CISO'
开发者Booster
格式类型磁盘映像
作为容器ISO映像

CSO格式第一版本(CSO v1)使用DEFLATE算法压缩数据,同时也提供了9个压缩级别,其中第9级为最高级别。第二版本在此基础上添加了LZ4算法的使用,但用户可为了保证向后兼容性仅使用DEFLATE算法进行压缩。压缩级别越高的代价是压缩时间的加长,但压缩级别不影响解压解压速度[2]。其工作原理为将一个ISO文件分成无数个大小一般为2 KiB的块,并一一地对这些块进行压缩。通过这种工作原理,CSO格式能有效地将ISO文件压缩成一个较小的文件。

文件格式

CSO文件格式由一个 24 字节的文件头、一份索引表和多个数据块组成。大于一字节的字段应使用小端法读取。

文件头

偏移量 名称 大小 (字节) 用途
0x0 魔术数字(Magic) 4 用于识别CSO文件,因此必须为CISO,当读取为32位整数时则是0x4F534943。对于CSO的其它衍生格式,这个字段可能会有所不同,比如ZSO使用的魔术数字ZISO
0x4 文件头大小(Header size) 4 在CSO格式第一版本中,由于此字段可被忽略,因此其数值的准确性不受保证。CSO格式第二版本以及ZSO格式要求此字段必须为0x18(即24字节)。
0x8 解压后大小(Uncompressed size) 8 文件完全解压后的大小(以字节为单位)。
0x10 数据块大小(Block size) 4 每个数据块在压缩前的大小。一般为2048字节,与ISO 9660扇区的大小一致。
0x14 版本 (Version) 1 文件所使用的CSO格式版本。对于CSO第一版本,该字段的数值可以为01;对于第二版本,数值则必须为2。此外,ZSO格式要求该字段的数值必须为1
0x15 索引对齐(Index alignment) 1 每个索引条目的对齐系数,以比特为单位。
0x16 预留(Reserved) 2 未使用。 在CSO第一格式中,该字段被忽略并且可能包含任意值。 在CSO第二格式中,该字段的值必须为零。

索引表

索引表中含有多个条目,每个条目的长度为4字节,记录着每个数据块在文件中的位置。最后一个条目必须指向文件末(EOF),因此会多出一个条目。索引表中的条目数量可以通过以下算法计算出来: 

条目所记录的内容如下:

长度 掩码 名称 用途
0 31 0x7FFFFFFF 位置(Position) 这个字段的数值经过左移后即数据块在文件中的位置,左移次数由文件头提供的索引对齐决定。
31 1 0x80000000 压缩方式(Compression type) CSO格式第一版本中,该字段所表述的压缩方式如下:
压缩方式
0 该数据块使用DEFLATE压缩算法。
1 该数据块未经过压缩。

ZSO格式与CSO格式第一版本基本一致,差别在于ZSO格式使用了LZ4算法,而非DEFLATE算法进行压缩。

CSO格式第二版本中,该字段所表述的压缩方式如下:

压缩方式
0 该数据块使用DEFLATE压缩算法。
1 该数据块使用LZ4压缩算法。

第二版本中,若该数据块的大小大过或等于文件头提供的数据块大小,则将其认定为未压缩方块。

数据块

每个数据块都包含未压缩或压缩的数据。每个块的实际大小可以通过使用下一个块的位置中减去该块的位置来计算。如果索引对齐大于零,则该数据块的块大小可能大于其保存的数据,因此需要进行填充

参考资料

  1. ^ CSO compression. [2008-02-28]. (原始内容存档于23 February 2008). 
  2. ^ unknownbrackets. Compression. GitHub. [2021-07-19]. (原始内容存档于2021-07-21). 

外部链接