Difference between revisions of "SARC (File Format)"
(Undo revision 985 by Celcodioc (talk). I think the old version is right, see Talk:SARC (File Format)#Node Hash) |
|||
Line 40: | Line 40: | ||
| 0x06 || 2 || '''Node count'''. | | 0x06 || 2 || '''Node count'''. | ||
|- | |- | ||
− | | 0x08 || 4 | | + | | 0x08 || 4 || '''Hash Multiplier'''. Always '''0x00000065'''. |
|- | |- | ||
| 0x0c || colspan=2 {{Unknown|End of '''SFAT''' header}} | | 0x0c || colspan=2 {{Unknown|End of '''SFAT''' header}} | ||
Line 51: | Line 51: | ||
! Offset !! Size !! Description | ! Offset !! Size !! Description | ||
|- | |- | ||
− | | 0x00 || 4 | | + | | 0x00 || 4 || '''File Name Hash'''. Look below for the calculation. |
|- | |- | ||
| 0x04 || 1 || {{Unknown|'''Unknown.''' Always '''0x01'''? Comparable to the file/folder flag from U8?}} | | 0x04 || 1 || {{Unknown|'''Unknown.''' Always '''0x01'''? Comparable to the file/folder flag from U8?}} | ||
Line 63: | Line 63: | ||
| 0x10 || colspan=2 {{Unknown|End of node}} | | 0x10 || colspan=2 {{Unknown|End of node}} | ||
|} | |} | ||
+ | |||
+ | ==== File Name Hash ==== | ||
+ | The hash is calculated like this: | ||
+ | <pre> | ||
+ | uint GetHash(char* name, int length, uint multiplier) | ||
+ | { | ||
+ | uint result = 0; | ||
+ | for(int i = 0; i < length; i++) | ||
+ | { | ||
+ | result = name[i] + result * multiplier; | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | </pre> | ||
== File Name Table == | == File Name Table == |
Revision as of 17:29, 3 September 2014
SARC Files are archive files used in Wii U software, including Mario Kart 8. They are similar to the U8 files found in GameCube and Wii games. Common extensions are .arc and .sarc (general), .pack (when the archive contains mostly other archive files), .bars (when it contains audio data), and .bgenv (when it contains shader files). SARC files are sometimes Yaz0 compressed into .szs files.
File Format
The basic structure of the archive is a SARC Header followed by a File Table and a File Name Table. Finally, the content of all files in the archive is stored directly. The File Table references the data.
Header (SARC)
Every SARC archive beings with a 0x14 byte SARC Header structure.
Offset | Size | Description |
---|---|---|
0x00 | 4 | Magic: 0x53415243 ("SARC" in ASCII). |
0x04 | 2 | Header Length: the length of this header in bytes. Always 0x14. |
0x06 | 2 | Byte order mark (BOM): 0xFE,0xFF for big endian and 0xFF,0xFE for little endian. |
0x08 | 4 | File size of the entire archive in bytes. |
0x0c | 4 | Beginning of data offset. |
0x10 | 4 | Unknown. Always 0x01000000? |
0x14 | End of SARC header |
File Table
Unlike the U8 format, SARC does generally not contain directory nodes (though files may reside inside subfolders). It is currently unknown if it is able to.
Header (SFAT)
The SARC Header is immediately followed by 0xc byte SFAT Header structure.
Offset | Type | Description |
---|---|---|
0x00 | 4 | Magic: 0x53464154 ("SFAT"). |
0x04 | 2 | Header Length: the length of this header in bytes. Always 0xc. |
0x06 | 2 | Node count. |
0x08 | 4 | Hash Multiplier. Always 0x00000065. |
0x0c | End of SFAT header |
Node
The SFAT Header is followed by an array of 0x10 byte SFAT Node structures.
Offset | Size | Description |
---|---|---|
0x00 | 4 | File Name Hash. Look below for the calculation. |
0x04 | 1 | Unknown. Always 0x01? Comparable to the file/folder flag from U8? |
0x05 | 3 | File name table entry offset, relative to the end of the file name table header, divided by 4. |
0x08 | 4 | Beginning of node file data, relative to the Beginning of data offset specified in the SARC header. |
0x0c | 4 | End of node file data, relative to the Beginning of data offset specified in the SARC header. |
0x10 | End of node |
File Name Hash
The hash is calculated like this:
uint GetHash(char* name, int length, uint multiplier) { uint result = 0; for(int i = 0; i < length; i++) { result = name[i] + result * multiplier; } return result; }
File Name Table
The File Name Table is a list of null-terminated strings which represent the filenames of the packed files. It is referenced by SFAT Nodes.
Header (SFNT)
The SFAT Node array is immediately followed by an 0x8 byte SFNT Header structure.
Offset | Size | Description |
---|---|---|
0x00 | 4 | Magic: 0x53464E54 ("SFNT"). |
0x04 | 2 | Header Length: the length of this header in bytes. Always 0x8. |
0x06 | 2 | Unknown. Always 0? |
0x08 | End of SFNT header |
Strings
The SFAT Header is immediately followed by 4-byte aligned null-terminated strings that represent the filenames of the packed files.
File Data
The data begins at the Beginning of data offset specified in the SARC Header. There is padding between the files for 256-byte (0x100) alignment.
Tools
The following tool can extract SARC files: