Basics¶
There are various, standard compression types used across PDI games, most often using their own headers with a magic starting with FF F7
. PS2ZIP is the most common.
Magic | Name | Compression Algorithm | Games |
---|---|---|---|
FF F7 EE C5 |
PS2ZIP | Inflate | GT3 -> GT7 |
FF F7 F3 2F |
PDIZIP | Inflate/ZLib | GT Sport -> GT7 |
FF F7 ED 85 |
ZSTD ZIP (Tiny) | ZSTD | GT7 |
FF F7 97 2F |
ZSTD ZIP | ZSTD | GT7 |
FF F7 F3 2E |
ZSTD ZIP Chunk | ZSTD | GT7 |
FE FE 65 FA |
? | Oodle? | GT7 (PS5) |
FE FD DB 45 |
? | Oodle? | GT7 (PS5) |
FE FD B3 45 |
? | Oodle? | GT7 (PS5) |
FE F2 E5 FA |
? | Oodle? | GT7 (PS5) |
Warning
If you are using C#, do NOT use DeflateStream to create compression streams, it's been proven to have a few issues with games unable to read through them. You can use it to decompress, though.
Prefer using ICSharpCode.SharpZipLib for creating compressed streams.
PS2ZIP (FF F7 EE C5)¶
Applies to: GT3 and above
Field | Offset | Type | Description |
---|---|---|---|
FF F7 EE C5 |
0x00 |
UInt |
Magic |
Size Complement | 0x04 |
Int |
Decompressed size (negated!) |
Start of compressed data | 0x08 |
Int |
Inflated data |
PDIZIP (FF F7 F3 2F)¶
Applies to: GT Sport and above
Field | Offset | Type | Description |
---|---|---|---|
FF F7 F3 2F |
0x00 |
UInt |
Magic |
expand_size | 0x04 |
UInt |
Total decompressed size (negated!) |
compressed_size | 0x08 |
UInt |
Total compressed size (negated!) |
fragment_size | 0x0C |
UInt |
Size of one fragment |
Fragments | 0x10 |
Fragment[] |
Compressed fragments. |
Fragment¶
Field | Offset | Type | Description |
---|---|---|---|
fragment_expand_size | 0x00 |
UInt |
Total decompressed size (negated!) |
fragment_compressed_size | 0x04 |
UInt |
Total compressed size (negated!) |
Unknown | 0x08 |
UInt |
? |
Start of compressed fragment data | 0x10 |
byte[] |
Size of one fragment |
ZSTD Zip Tiny (FF F7 ED 85)¶
Applies to: GT7
This format is normally not chunked.
Non-Chunked¶
Field | Offset | Type | Description |
---|---|---|---|
FF F7 ED 85 |
0x00 |
UInt |
Magic |
uncompressed_size | 0x04 |
UInt |
Total decompressed size (negated!) |
Start of compressed data | 0x08 |
byte[] |
ZSTD compressed data |
ZSTD Zip (FF F7 ED 85)¶
Applies to: GT7
Field | Offset | Type | Description |
---|---|---|---|
FF F7 97 2F |
0x00 |
UInt |
Magic |
uncompressed_size_lo | 0x04 |
UInt |
Total decompressed size (lower 32 bits) |
uncompressed_size_hi | 0x08 |
short |
Total decompressed size (upper 16 bits) |
compressed_size_lo | 0x0A |
UInt |
Total decompressed size (lower 32 bits) |
compressed_size_hi | 0x0E |
short |
Total decompressed size (upper 16 bits) |
Unknown | 0x10 |
byte[0x0C] |
N/A |
Flags | 0x1C |
UInt |
0x01 = Fragmented |
Tip
If fragmented, chunks may follow after. There is no chunk count, so check the magic accordingly.
ZSTD Chunk¶
These will all appear one after the other (including magic).
Field | Offset | Type | Description |
---|---|---|---|
FF F7 F3 2E |
0x00 |
UInt |
Magic |
chunk_uncompressed_size | 0x04 |
UInt |
Decompressed size of the chunk |
chunk_compressed_size | 0x08 |
UInt |
Compressed size of the chunk |
crc_checksum | 0x0C |
UInt |
CRC Checksum of the chunk |