Memory mapped ARchiver format
- Random Access
- No compression
- No hash verification (CRC SHA ...)
- Get
ReadOnlySpan<byte>directly through memory mapping
Detail
File layout:
<Head> <Version> <Data> <Data> ... <Manifest> <Tail>
-
Head
"\0MAR📦"in utf8, 📦 is emoji
00 4D 41 52 F0 9F 93 A6 -
Version
(int Major, int Minor, int Patch)ser by MsgPack
It is the format version, not the library version
0.1.0is93 00 01 00 -
Data
Just simply bytes
-
Manifest
Dictionary<string, (ulong Offset, ulong Size)>ser by MsgPack -
Tail
Little endian
uintmanifest size
Usage
{ await using var builder = await MarBuilder.CreateAsync("./test.mar"); await builder.AddFileAsync("test.txt", "Hello, World!"); // await builder.AddFileAsync("test.txt", "Hello, World!", Encoding.Utf16); // Specify encoding await builder.AddFileAsync("some.bin", new byte[] { 1, 2, 3, 4, 5 }); // await builder.AddFileAsync("test.txt", SomeStream); } { using var mar = MarArchive.Open("./test.mar"); mar.TryGetString("test.txt", out string data); Console.WriteLine(data); // Output: Hello, World! mar.TryGet("test.txt", out ReadOnlySpan<byte> span); Console.WriteLine(string.Join(", ", span.ToArray())); // Output: 1, 2, 3, 4, 5 Console.WriteLine(mar.TryGet("asd", out _)); // Output: False }