WiiUSharp.Rpx
0.6.0
dotnet add package WiiUSharp.Rpx --version 0.6.0
NuGet\Install-Package WiiUSharp.Rpx -Version 0.6.0
<PackageReference Include="WiiUSharp.Rpx" Version="0.6.0" />
<PackageVersion Include="WiiUSharp.Rpx" Version="0.6.0" />
<PackageReference Include="WiiUSharp.Rpx" />
paket add WiiUSharp.Rpx --version 0.6.0
#r "nuget: WiiUSharp.Rpx, 0.6.0"
#:package WiiUSharp.Rpx@0.6.0
#addin nuget:?package=WiiUSharp.Rpx&version=0.6.0
#tool nuget:?package=WiiUSharp.Rpx&version=0.6.0
WiiUSharp
.NET libraries for Wii U file formats and title concepts.
Not affiliated with or endorsed by Nintendo. Wii U is a trademark of Nintendo.
The NFS container format was worked out from nfs2iso2nfs by sabykos, piratesephiroth and FIX94, the NUS package layout from NUSPacker by Maschell (timogus), and RPX compression from wiiurpxtool by CBH. WiiUSharp.Nfs, WiiUSharp.Nus and WiiUSharp.Rpx are new implementations of those formats, not ports of their code.
No keys ship with these packages. The common key, title keys and htk.bin are yours to supply.
Packages
| Package | Targets | Purpose |
|---|---|---|
WiiUSharp |
net48, net6.0, net8.0, net10.0 | Title identity and presentation: TitleId, GroupId, ProductCode, Region, Language, per-language names, and the ImageSlot / BootSound formats a title ships with. |
WiiUSharp.Nfs |
net48, net6.0, net8.0, net10.0 | The vWii disc container (content/hif_*.nfs): header, sparse part table, per-sector AES, 250 MB split. |
WiiUSharp.Imaging |
net48, net6.0, net8.0, net10.0 | Turns PNG, JPEG, BMP, WebP or TGA into the exact TGA an ImageSlot needs. SkiaSharp + TargaSharp; no System.Drawing. |
WiiUSharp.Audio |
net48, net6.0, net8.0, net10.0 | Turns WAV, MP3 or AIFF into bootSound.btsnd: 48 kHz stereo 16-bit, six seconds. NAudio.Core + NLayer; no Windows codecs. |
WiiUSharp.Nus |
net48, net6.0, net8.0, net10.0 | Packs a code/content/meta folder into an installable title: FST, hashed and plain contents, fake-signed TMD and ticket. |
WiiUSharp.Rpx |
net48, net6.0, net8.0, net10.0 | RPX/RPL executables: load with every section plain, replace section bytes, save compressed or not with the CRC table rebuilt. |
dotnet add package WiiUSharp
dotnet add package WiiUSharp.Nfs
dotnet add package WiiUSharp.Imaging
dotnet add package WiiUSharp.Audio
dotnet add package WiiUSharp.Nus
dotnet add package WiiUSharp.Rpx
Usage
Title metadata
using WiiUSharp;
var game = new Game(
new TitleId(TitleType.Demo, 0x12345678),
new GroupId(0x5678),
new ProductCode(ProductCode.EShop, "FAAE"))
{
Region = Region.All,
Names = LocalizedName.ForAllLanguages(new LocalizedName("Super Metroid")),
};
string id = game.TitleId.ToString(); // "0005000212345678"
ImageSlot icon = ImageSlot.Icon; // iconTex.tga, 128x128, 32 bpp
Title images
using WiiUSharp.Imaging;
TitleImage.Convert("icon.png", ImageSlot.Icon, @"title\meta\iconTex.tga"); // resized to 128x128, 32 bpp, uncompressed, no footer
var problems = TitleImage.Problems(new TgaFile("bootTvTex.tga"), ImageSlot.BootTv); // empty when it fits
Boot sound
using WiiUSharp.Audio;
BootSoundConverter.Convert("boot.mp3", @"title\meta\bootSound.btsnd"); // resampled, stereo, first six seconds
BootSound sound = BootSound.Load(@"title\meta\bootSound.btsnd"); // header + samples of an existing one
NFS container
using WiiUSharp.Nfs;
var key = NfsKey.FromFile(@"title\code\htk.bin");
// read: a seekable stream of the decrypted payload, no temp file
using Stream payload = NfsReader.Open(@"title\content", key).OpenPayload();
// write: pack, encrypt and split in one pass
new NfsWriter(key).Write(payload, new DiscDataSpan(0xF800000, gameLength), @"out\content");
The payload is a Wii disc image with its game partitions decrypted. Converting to or from a normal ISO needs Wii partition crypto, which WiiUSharp.Nfs does not implement — supply an IPartitionCipher and use NfsConverter. See .docs/WiiUSharp.Nfs.md.
Packing a title
using WiiUSharp.Nus;
var packer = new NusPacker(CommonKey.Parse("<wii u common key>"));
NusPackage package = packer.Pack(@"title", @"out", TitleKey.Parse("13371337133713371337133713371337"));
// out\title.tmd, title.tik, title.cert, 00000000.app (FST), 00000001.app ... and a .h3 per hashed content
Title values come from code/app.xml; pass a TitleInfo to override them, your own ContentRule list to change which files share a content, or a real title.cert to replace the generated stub. Output is fake-signed and installs with the usual signature patches. See .docs/WiiUSharp.Nus.md.
Executables
using WiiUSharp.Rpx;
RpxFile rpx = RpxFile.Load(@"title\code\WUP-JAAE.rpx"); // compressed sections are inflated on load
Section rodata = rpx.FindSection(".rodata")!;
rodata.Data = Patched(rodata.Data); // any byte change, any length
rpx.Save(@"title\code\WUP-JAAE.rpx", compress: true); // CRC table rebuilt, layout as wiiurpxtool writes it
Building
dotnet build WiiUSharp.sln
dotnet test WiiUSharp.sln
Requires the .NET 10 SDK (global.json). dotnet pack -c Release produces the NuGet packages.
License
MIT — see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Framework | net48 is compatible. net481 was computed. |
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.6.0 | 0 | 9/14/2026 |
0.6.0: initial release.