diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c59500 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# Sindri + +Asset packer. + +## Design + +The data layout design is very simple. It consists of data split into chunks +with the first chunk holding the metadata for the structure and files. + +### Spec + +``` + METADATA DATA +|---------------------------------------------------------------------------||------| + +[ MAGIC ][ VERSION ][ COMPRESSION ][ SIZE_PER_CHUNK ][ TOTAL_SIZE ][ #FILES ][ DATA ] # chunk 1 +[ DATA ] # chunk 2 +[ DATA ] # etc.. +[ DATA ] # last chunk +``` + +#### Magic string + +Magic string to detect if the read file is what we expect it is. +Represented in 3 bytes. + +Value is `0x514D21`, the closest approximation of "Sindri". + +### Version + +Version of the specification. +Represented in 2 bytes. + +Value is `1` currently. + +### Compression + +Wether LZ4 compression is enabled/disabled. +Represented in 1 byte. + +Value is configurable, defaulting to `0`. + +`0` = off +`1` = default LZ4 algorithm +`2` = lowest LZ4-HC algorithm, faster and larger +.. +`12` = highest LZ4-HC algorithm, slower and smaller + +### Size per chunks + +The size in bytes of each chunk. +Represented in 8 bytes. + +Value is configurable, defaulting to `2GiB`. + +### Total size + +The total size in bytes of all chunks combined. +Represented in 8 bytes. + +### Number of files + +The total number of files in the pack. +Represented in 4 bytes. + +### A file + +Piece of data stored, consisting of 3 parts: + +- Path +- Offset +- Size + +#### Path + +Path of the file as if it were on the filesystem. +Represented in 512 bytes. + +#### Offset + +The offset to the file, starting from the true 0th byte of the first chunk. +Represented in 8 bytes. + +#### Size + +Size of the file. +Represented in 8 bytes.