PBG3 format

The PBG3 format is an archive format used by EoSD.

It is a bitstream composed of a header, a file table, and LZSS-compressed files.

Reading integers

Integers in PBG3 files are never signed, they are not byte-aligned, and have a variable size.
Their size is given by two bits: 00 means the number is stored in one byte, 10 means it is stored in three bytes.

Ex:

    0x0012 is stored as: 0000010010
    0x0112 is stored as: 010000000100010010

Reading strings

Strings are stored as standard NULL-terminated sequences of bytes.
The only catch is they are not byte-aligned.

Header

The header is composed of three fields:

The size of the header is thus comprised between 52 bits and 100 bits.

File table

The file table starts at a byte boundary, but as the rest of the file, isn't byte-aligned.
It consists of a sequence of entries.
Each entry is composed of five fields:

The checksum is a mere sum of the compressed data.
Files are compressed using the LZSS algorithm, with a dictionary size of 8192 bytes and a minimum matching length of 4 bytes.
The size of the offset component of (offset, length) tuples is 13 bits, whereas the size of the length component is 4 bits.
A file ends with a (0, 0) tuple, that is, 18 zero bits.

Uncompressing a LZSS-compressed file is quite easy, see lzss.py.