name | BitsKit |
nuget | https://www.nuget.org/packages/BitsKit/ |
link | https://github.com/barncastle/BitsKit |
author | barncastle |
Reading efficiently from a bit structure
This is how you can use BitsKit .
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> <ItemGroup> <PackageReference Include="BitsKit" Version="1.0.0" /> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
using BitsDemo; var z = new zlib_header(0x78,0x9C); Console.WriteLine( z.FLEVEL ); Console.WriteLine(z.CM);
using BitsKit; using BitsKit.BitFields; using System.IO.Compression; namespace BitsDemo; //[BitObject(BitOrder.LeastSignificant)] //partial struct zlib_header //{ // public zlib_header(byte cmf,byte flg) // { // CMF = cmf; // FLG = flg; // } // [EnumField("CM",4,typeof(CompressionMode))] // [BitField("CINFO",4)] // private byte CMF; // [BitField("FCHECK",5)] // [BooleanField("FDICT")] // [EnumField("FLEVEL",2,typeof(CompressionLevel))] // private byte FLG; //} [BitObject(BitOrder.LeastSignificant)] partial struct zlib_header { public zlib_header(byte cmf,byte flg) { CMF = cmf; FLG = flg; } [BitField("CM",4)] [BitField("CINFO",4)] private byte CMF; [BitField("FCHECK",5)] [BitField("FDICT",1)] [BitField("FLEVEL",2)] private byte FLG; }
The code that is generated is
#nullable enable #pragma warning disable IDE0005 // Using directive is unnecessary #pragma warning disable IDE0005_gen // Using directive is unnecessary #pragma warning disable CS8019 // Unnecessary using directive. #pragma warning disable IDE0161 // Convert to file-scoped namespace using System; using System.Runtime.InteropServices; using BitsKit.Primitives; namespace BitsDemo { partial struct zlib_header { public Byte CM { get => BitPrimitives.ReadUInt8LSB(CMF,0,4); set => BitPrimitives.WriteUInt8LSB(ref CMF,0,value,4); } public Byte CINFO { get => BitPrimitives.ReadUInt8LSB(CMF,4,4); set => BitPrimitives.WriteUInt8LSB(ref CMF,4,value,4); } public Byte FCHECK { get => BitPrimitives.ReadUInt8LSB(FLG,0,5); set => BitPrimitives.WriteUInt8LSB(ref FLG,0,value,5); } public Byte FDICT { get => BitPrimitives.ReadUInt8LSB(FLG,5,1); set => BitPrimitives.WriteUInt8LSB(ref FLG,5,value,1); } public Byte FLEVEL { get => BitPrimitives.ReadUInt8LSB(FLG,6,2); set => BitPrimitives.WriteUInt8LSB(ref FLG,6,value,2); } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/BitsKit
Leave a Reply