CSO,又稱CISO(源自英文Compressed ISO的縮寫),是一種計算機文件格式,由經過壓縮後的ISO映像產生。[1]其是首個為了壓縮ISO映像而開發出來的方案,常被用於壓縮PS2以及PSP平台上的ISO文件,以降低存儲空間上的壓力。此外,為了優化該格式的資料壓縮比以及解壓速度等問題,該格式經歷過了數次修改與迭代,產生了諸如CSO v2DAXJSOZSO等格式。

壓縮版ISO映像
副檔名
.cso
網路媒體型式
application/x-compressed-iso
開發者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). 

外部連結