RSCG – Darp.BinaryObjects
| name | Darp.BinaryObjects |
| nuget | https://www.nuget.org/packages/Darp.BinaryObjects/ |
| link | https://github.com/rosslight/Darp.BinaryObjects |
| author | Ross Light GmbH |
Serialize bits of data
This is how you can use Darp.BinaryObjects .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Darp.BinaryObjects" Version="0.4.0" />
</ItemGroup>
</Project>
The code that you will use is
using BitsDemo;
using Darp.BinaryObjects;
var z = new zlib_header(0x78,0x9C);
var size = z.GetByteCount();
// Write the values back to a buffer
var writeBuffer = new byte[size];
if(z.TryWriteLittleEndian(writeBuffer))
{
Console.WriteLine("writing to buffer" );
foreach (var item in writeBuffer)
{
Console.Write(item+" ");
}
}
using Darp.BinaryObjects;
using System.IO.Compression;
namespace BitsDemo;
[BinaryObject]
partial record zlib_header(byte cmf,byte flg)
{
}
The code that is generated is
// <auto-generated/>
#nullable enable
namespace BitsDemo
{
/// <remarks> <list type="table">
/// <item> <term><b>Field</b></term> <description><b>Byte Length</b></description> </item>
/// <item> <term><see cref="cmf"/></term> <description>1</description> </item>
/// <item> <term><see cref="flg"/></term> <description>1</description> </item>
/// <item> <term> --- </term> <description>2</description> </item>
/// </list> </remarks>
partial record zlib_header : global::Darp.BinaryObjects.IWritable,global::Darp.BinaryObjects.ISpanReadable<zlib_header>
{
/// <inheritdoc />
[global::System.Diagnostics.Contracts.Pure]
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public int GetByteCount() => 2;
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public bool TryWriteLittleEndian(global::System.Span<byte> destination) => TryWriteLittleEndian(destination,out _);
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public bool TryWriteLittleEndian(global::System.Span<byte> destination,out int bytesWritten)
{
bytesWritten = 0;
if (destination.Length < 2)
return false;
global::Darp.BinaryObjects.Generated.Utilities.WriteUInt8(destination[0..],this.cmf);
global::Darp.BinaryObjects.Generated.Utilities.WriteUInt8(destination[1..],this.flg);
bytesWritten += 2;
return true;
}
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public bool TryWriteBigEndian(global::System.Span<byte> destination) => TryWriteBigEndian(destination,out _);
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public bool TryWriteBigEndian(global::System.Span<byte> destination,out int bytesWritten)
{
bytesWritten = 0;
if (destination.Length < 2)
return false;
global::Darp.BinaryObjects.Generated.Utilities.WriteUInt8(destination[0..],this.cmf);
global::Darp.BinaryObjects.Generated.Utilities.WriteUInt8(destination[1..],this.flg);
bytesWritten += 2;
return true;
}
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public static bool TryReadLittleEndian(global::System.ReadOnlySpan<byte> source,[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out zlib_header? value) => TryReadLittleEndian(source,out value,out _);
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public static bool TryReadLittleEndian(global::System.ReadOnlySpan<byte> source,[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out zlib_header? value,out int bytesRead)
{
bytesRead = 0;
value = default;
if (source.Length < 2)
return false;
var ___readcmf = global::Darp.BinaryObjects.Generated.Utilities.ReadUInt8(source[0..1]);
var ___readflg = global::Darp.BinaryObjects.Generated.Utilities.ReadUInt8(source[1..2]);
bytesRead += 2;
value = new zlib_header(___readcmf,___readflg);
return true;
}
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public static bool TryReadBigEndian(global::System.ReadOnlySpan<byte> source,[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out zlib_header? value) => TryReadBigEndian(source,out value,out _);
/// <inheritdoc />
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
public static bool TryReadBigEndian(global::System.ReadOnlySpan<byte> source,[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out zlib_header? value,out int bytesRead)
{
bytesRead = 0;
value = default;
if (source.Length < 2)
return false;
var ___readcmf = global::Darp.BinaryObjects.Generated.Utilities.ReadUInt8(source[0..1]);
var ___readflg = global::Darp.BinaryObjects.Generated.Utilities.ReadUInt8(source[1..2]);
bytesRead += 2;
value = new zlib_header(___readcmf,___readflg);
return true;
}
}
}
namespace Darp.BinaryObjects.Generated
{
using Darp.BinaryObjects;
using System;
using System.Buffers.Binary;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
/// <summary>Helper methods used by generated BinaryObjects.</summary>
[GeneratedCodeAttribute("Darp.BinaryObjects.Generator","0.4.0.0")]
file static class Utilities
{
/// <summary> Writes a <c>byte</c> to the destination </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void WriteUInt8(Span<byte> destination,byte value)
{
destination[0] = value;
}
/// <summary> Reads a <c>byte</c> from the given source </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static byte ReadUInt8(ReadOnlySpan<byte> source)
{
return source[0];
}
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Darp.BinaryObjects
Leave a Reply