Skip to content

C++ tools for reading/writing binary data

License

Moneyl/BinaryTools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BinaryTools

C++ classes for reading/writing binary data and some helper functions/classes. Based on C#'s BinaryReader and BinaryWriter.

BinaryReader & BinaryWriter

Classes which can read/write binary data to/from a file or memory buffer. Both have functions for the most common primitive types. Ex: uint32_t, int32_t, uint64_t, int64_t, float, double, etc. See BinaryReader.h and BinaryWriter.h for a full list. The constructor used determines whether the class reads from a file (the constructor provides a file path), or a memory region (it provides a memory address and size). They can also read and write entire structs to or from memory using ReadToMemory and WriteFromMemory, respectively.

Other helpers and included classes

  • Span<T>: A very simple wrapper around a fixed sized memory region used by ReadAllBytes. You must free the memory the span points to if it's heap allocated.
  • MemoryBuffer: A simple class which inherits std::streambuf. Used by BinaryReader/Writer when interacting with a memory buffer.
  • ReadAllBytes(const std::string& filePath): Function that reads all bytes from a file and returns them in a Span. Since it's using a span you must free the memory it returns once you're done with it.

Example

This example shows how to read/write files and in memory buffers using BinaryReader and BinaryWriter.

#include <BinaryReader.h> #include <BinaryWriter.h> #include <string> #include <iostream> #include <assert.h> //You can specify data layouts with a struct and read/write them in one go struct ExampleHeader { uint32_t Signature = 0xF00F; uint32_t Version = 10; uint32_t Value0 = 1024; float Value1 = 45.2f; float Value2 = 800.9f; }; int main() { //Write test file to your project directory std::string testFilePath = "TestFile0.bin"; //File writing { BinaryWriter writer(testFilePath); writer.WriteUint32(100); writer.WriteFloat(512.0f); writer.WriteNullTerminatedString("Hello binary!"); //Write padding bytes to align to value. E.g. position = 13. After align(4), position = 16, the next multiple of 4. writer.Align(4); //Can also write whole structs/classes to files ExampleHeader header; writer.WriteFromMemory(&header, sizeof(ExampleHeader)); } //File reading { BinaryReader reader(testFilePath); //Assumes that the file already exists assert(reader.ReadUint32() == 100); assert(reader.ReadFloat() == 512.0f); assert(reader.ReadNullTerminatedString() == "Hello binary!"); reader.Align(4); //Can also read whole structs/classes from files ExampleHeader header; reader.ReadToMemory(&header, sizeof(ExampleHeader)); assert(header.Signature == 0xF00F); assert(header.Version == 10); assert(header.Value0 == 1024); assert(header.Value1 == 45.2f); assert(header.Value2 == 800.9f); } //Reading from memory { uint32_t someBuffer[5] = { 256, 700, 12, 895, 5784 }; BinaryReader reader2((char*)&someBuffer, 5 * sizeof(uint32_t)); assert(reader2.ReadUint32() == 256); assert(reader2.ReadUint32() == 700); assert(reader2.ReadUint32() == 12); assert(reader2.ReadUint32() == 895); assert(reader2.ReadUint32() == 5784); } } 

About

C++ tools for reading/writing binary data

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages