Skip to content

MrKWatkins/BinaryPrimitives

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BinaryPrimitives

Build Status NuGet Version NuGet Downloads

Extension methods on primitives types for various binary operations, such as reading and writing values from bytes and calculating parity.

The name is based on the BinaryPrimitives class in the .NET Framework which provides similar methods.

Full documentation is available at mrkwatkins.github.io/BinaryPrimitives. Source code and issue tracking are on GitHub.

Installation

dotnet add package MrKWatkins.BinaryPrimitives

Usage

Reading and Writing

Read and write multi-byte integers from byte[], Span<byte>, Stream, and other byte container types. All methods support an optional Endian parameter (defaulting to Endian.Little):

byte[] data = new byte[8];
data.SetInt32(0, 42);
data.SetUInt16(4, 1000, Endian.Big);

int    a = data.GetInt32(0);              // 42
ushort b = data.GetUInt16(4, Endian.Big); // 1000

Collections can have values appended directly:

var buffer = new List<byte>();
buffer.AddUInt32(0xDEADBEEF);
buffer.AddInt16(-1, Endian.Big);

Streams support typed reading and writing, with async overloads for all methods:

stream.WriteInt32(42);
int value = stream.ReadInt32OrThrow();

Bit Operations

Get, set, and clear individual bits or ranges of bits on byte, ushort, int, uint, long, and ulong:

byte b = 0b00001010;
bool set   = b.GetBit(1);     // true
byte with0 = b.SetBit(0);     // 0b00001011
byte clear = b.ResetBit(1);   // 0b00001000
byte range = b.GetBits(1, 3); // bits 1..3, shifted to position 0

byte also provides nibble access, parity, and CPU flag detection:

byte high = b.HighNibble(); // bits 4-7
bool even = b.Parity();     // true if an even number of bits are set

All supported integer types can be formatted as a binary string:

string s = ((byte)0x5A).ToBinaryString(); // "0b01011010"

Streams

ReadOnlyListStream wraps an IReadOnlyList<byte> as a seekable, read-only Stream:

IReadOnlyList<byte> bytes = LoadBytes();
using var stream = new ReadOnlyListStream(bytes);

PeekableStream wraps any readable Stream to add one-byte lookahead without consuming theindex.md byte:

using var stream = new PeekableStream(inner);
if (stream.Peek() == 0xFF)
{
    stream.ReadByteOrThrow(); // consume it
}

Use of AI

My general rule is I'll write the interesting bits and use AI for the boring bits. I wrote the bulk of the code as part of my OakEmu project before forking it out into its own project. The main use of AI has been to generate the documentation and help with test coverage.

Licencing

Licensed under GPL v3.0.

About

Extension methods on primitives types for various binary operations, such as reading and writing values from bytes and calculating parity.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages