diff --git a/SabreTools.Data.Models/N3DS/Constants.cs b/SabreTools.Data.Models/N3DS/Constants.cs
index 7931412e..12483d73 100644
--- a/SabreTools.Data.Models/N3DS/Constants.cs
+++ b/SabreTools.Data.Models/N3DS/Constants.cs
@@ -22,5 +22,9 @@ namespace SabreTools.Data.Models.N3DS
public static byte[] RomfsCounter = [0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
public const int CXTExtendedDataHeaderLength = 0x800;
+
+ // Z3DS
+
+ public const string Z3DSMagicNumber = "Z3DS";
}
}
diff --git a/SabreTools.Data.Models/N3DS/Z3DSFileHeader.cs b/SabreTools.Data.Models/N3DS/Z3DSFileHeader.cs
new file mode 100644
index 00000000..44674c45
--- /dev/null
+++ b/SabreTools.Data.Models/N3DS/Z3DSFileHeader.cs
@@ -0,0 +1,52 @@
+namespace SabreTools.Data.Models.N3DS
+{
+ ///
+ /// File header for Zstd-compressed 3DS data
+ ///
+ ///
+ public class Z3DSFileHeader
+ {
+ ///
+ /// Magic ID, always 'Z3DS'
+ ///
+ /// 4 bytes
+ public string Magic { get; set; } = string.Empty;
+
+ ///
+ /// Magic ID of the compressed structure
+ ///
+ /// 4 bytes
+ public string UnderlyingMagic { get; set; } = string.Empty;
+
+ ///
+ /// Header version
+ ///
+ /// Currently only a value of 1 is expected
+ public byte Version { get; set; }
+
+ ///
+ /// Reserved
+ ///
+ public byte Reserved { get; set; }
+
+ ///
+ /// Header size
+ ///
+ public ushort HeaderSize { get; set; }
+
+ ///
+ /// Metadata size
+ ///
+ public uint MetadataSize { get; set; }
+
+ ///
+ /// Compressed size of the structure data
+ ///
+ public ulong CompressedSize { get; set; }
+
+ ///
+ /// Uncompressed size of the structure data
+ ///
+ public ulong UncompressedSize { get; set; }
+ }
+}