ForeverZer0 / SharpNBT

A pure CLS-compliant C# implementation of the Named Binary Tag (NBT) format specification commonly used with Minecraft applications, allowing easy reading/writing streams and serialization to other formats.
MIT License
25 stars 9 forks source link
c-sharp clscompilant csharp dotnet minecraft minecraft-bedrock minecraft-java named-binary-tag nbt netstandard serialization snbt stream stringify

SharpNBT

.NET License Version Downloads

Java Bedrock

A CLS-compliant implementation of the Named Binary Tag (NBT) specifications (Java/Bedrock), written in pure C# with no external dependencies and targeting a wide variety of .NET implementations and languages on all platforms.

Features

Usage

Please see the wiki for more detailed explanations. Feel free to improve it by contributing!

Reading

At its simplest, reading an NBT document is one-liner:

CompoundTag tag = NbtFile.Read("/path/to/file.nbt", FormatOptions.Java, CompressionType.AutoDetect);

Writing

Likewise writing a completed NBT tag is a one-liner:

// Assuming "tag" is a valid variable
NbtFile.Write("/path/to/file.nbt", tag, FormatOptions.BedrockFile, CompressionType.ZLib);

Viewing

While there is functionality to output NBT to other human-readable formats like JSON, if you simply need to visualize a tag, there is a custom "pretty printed" output you can use:

bigtest.nbt from https://wiki.vg/


var tag = NbtFile.Read("bigtest.nbt", FormatOptions.Java, CompressionType.GZip);
Console.WriteLine(tag.PrettyPrinted())

Output

TAG_Compound("Level"): [11 entries]
{
    TAG_Long("longTest"): 9223372036854775807
    TAG_Short("shortTest"): 32767
    TAG_String("stringTest"): "HELLO WORLD THIS IS A TEST STRING ÅÄÖ!"
    TAG_Float("floatTest"): 0.49823147
    TAG_Int("intTest"): 2147483647
    TAG_Compound("nested compound test"): [2 entries]
    {
        TAG_Compound("ham"): [2 entries]
        {
            TAG_String("name"): "Hampus"
            TAG_Float("value"): 0.75
        }
        TAG_Compound("egg"): [2 entries]
        {
            TAG_String("name"): "Eggbert"
            TAG_Float("value"): 0.5
        }
    }
    TAG_List("listTest (long)"): [5 entries]
    {
        TAG_Long(None): 11
        TAG_Long(None): 12
        TAG_Long(None): 13
        TAG_Long(None): 14
        TAG_Long(None): 15
    }
    TAG_List("listTest (compound)"): [2 entries]
    {
        TAG_Compound(None): [2 entries]
        {
            TAG_String("name"): "Compound tag #0"
            TAG_Long("created-on"): 1264099775885
        }
        TAG_Compound(None): [2 entries]
        {
            TAG_String("name"): "Compound tag #1"
            TAG_Long("created-on"): 1264099775885
        }
    }
    TAG_Byte("byteTest"): 127
    TAG_Byte_Array("byteArrayTest (the first 1000 values of (n*n*255+n*7)%100, starting with n=0 (0, 62, 34, 16, 8, ...))"): [1000 elements]
    TAG_Double("doubleTest"): 0.4931287132182315
}

Much More!

There is much more to SharpNBT than the examples above, please see the wiki for more details, with real-world examples.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/ForeverZer0/SharpNBT. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

Pull requests are always welcome.

License

The project is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the SharpNBT project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

Special Thanks

This project would not be possible without all the contributors to the https://wiki.vg/ site and its maintainers, who have created an invaluable source of information for developers for everything related to the game of Minecraft.


If you benefit from this project, please consider supporting it by giving it a star on GitHub!