RSCG – BitsKit

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


Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *