libyaz0 – A library for compressing and decompressing Yaz0/1 compression formats.

libyaz0 is a library in Python for decompressing and compressing Yaz0/1 compression formats.
Written in Python 3.

Yaz0 is a compression format used in several games from the N64, GC, Wii, 3DS, Wii U, and now the Switch.

few of those games:

  • The Legend of Zelda: Ocarina of Time.
  • Super Mario Sunshine.
  • Mario Kart Wii.
  • Super Mario 3D Land.
  • New Super Mario Bros. U.
  • Mario Kart 8.
  • Breath of the Wild.
  • ARMS.
  • Splatoon 2.

I’d say it’s a Nintendo-favorite. :>

——————————————————————————————–

Example of how Yaz0 compressed data can be decompressed:

Code:
from libyaz0 import decompress

# Yaz0 compressed data
data = b"Yaz0\x00\x00\x00\x10\x00\x00\x00\x00\x00" \
          b"\x00\x00\x00\xfbThis \x10\x02a \xf8test!"

# Decompress it
decompressed_data = decompress(data)
Code:
>>> decompressed_data.decode('utf-8')
'This is a test!'

——————————————————————————————–

Example of how decompressed data can be Yaz0 compressed:

Code:
from libyaz0 import compress

# Decompressed data
data = 'This is a test!'.encode('utf-8')

# Compress it
## unk: the 4-bytes value that will be located at 0x8-0xC of the Yaz0 header
### default is 0x00000000
unk = 0

## level: compression level.
### 0: No compression (Fastest)
### 9: Best compression (Slowest)
#### default is 1
level = 9

compressed_data = compress(data, unk, level)
Code:
>>> compressed_data
b'Yaz0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\xfbThis \x10\x02a \xf8test!'

——————————————————————————————–

libyaz0 can also be used to guess the file extension from the decompressed data.

File formats libyaz0 can detect:

  • BNTX (.bntx)
  • BNSH (.bnsh)
  • BFLAN (.bflan)
  • BFLYT (.bflyt)
  • BFLIM (.bflim)
  • GTX (.gtx)
  • SARC (.sarc)
  • Yaz0/SZS (.yaz0)

 

Code:
from libyaz0 import guessFileExt

# Guess the file extension from the decompressed data
file_extension = guessFileExt(decompressed_data)

——————————————————————————————–

libyaz0 can also be used as a standalone program. (Download below)

Usage:

  • libyaz0 [option…] input

Options:

  • -o <output>: Output file, if not specified, the output file will have the same name as the intput file
  • -c: Compress (Will try to decompress if not specified)

Compression options:

  • -level <level>: compression level (1-9) (1 is the default)
    0: No compression (Fastest)
    9: Best compression (Slowest)
  • -unk <unk>: the unknown value that will be located at 0x8-0xC (0x00000000 is the default)

——————————————————————————————–

Download:

You can get libyaz0 using pip:

Code:
pip install libyaz0==0.4

Or you could get the source code from GitHub.
Github.
Standalone program (Windows).

——————————————————————————————–

Credits:
Written by AboodXD.
Decompression algorithm based on wszst’s.
Special thanks to RoadrunnerWMC for helping with looking up matches for the compression algorithm.