Heim > Backend-Entwicklung > C++ > Wie können Bitfelder in C# mithilfe von Attributen implementiert und darauf zugegriffen werden?

Wie können Bitfelder in C# mithilfe von Attributen implementiert und darauf zugegriffen werden?

DDD
Freigeben: 2025-01-03 21:29:41
Original
982 Leute haben es durchsucht

How Can Bit Fields Be Implemented and Accessed in C# Using Attributes?

Bitfelder in C#

Der folgende C#-Code zeigt, wie man Bitfelder innerhalb einer Struktur erstellt und den Bitzugriff mithilfe des Punktoperators ermöglicht.

using System;

namespace BitfieldTest
{
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
    sealed class BitfieldLengthAttribute : Attribute
    {
        uint length;

        public BitfieldLengthAttribute(uint length)
        {
            this.length = length;
        }

        public uint Length { get { return length; } }
    }

    static class PrimitiveConversion
    {
        public static long ToLong<T>(T t) where T : struct
        {
            long r = 0;
            int offset = 0;

            foreach (var f in t.GetType().GetFields())
            {
                var attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false);
                if (attrs.Length == 1)
                {
                    uint fieldLength = ((BitfieldLengthAttribute)attrs[0]).Length;
                    long mask = 0;
                    for (int i = 0; i < fieldLength; i++)
                        mask |= 1L << i;

                    r |= ((UInt32)f.GetValue(t) & mask) << offset;
                    offset += (int)fieldLength;
                }
            }

            return r;
        }
    }

    struct PESHeader
    {
        [BitfieldLength(2)]
        public uint reserved;
        [BitfieldLength(2)]
        public uint scrambling_control;
        [BitfieldLength(1)]
        public uint priority;
        [BitfieldLength(1)]
        public uint data_alignment_indicator;
        [BitfieldLength(1)]
        public uint copyright;
        [BitfieldLength(1)]
        public uint original_or_copy;
    };

    public class MainClass
    {
        public static void Main(string[] args)
        {
            PESHeader p = new PESHeader();

            p.reserved = 3;
            p.scrambling_control = 2;
            p.data_alignment_indicator = 1;

            long l = PrimitiveConversion.ToLong(p);

            for (int i = 63; i >= 0; i--)
                Console.Write(((l & (1L << i)) > 0) ? "1" : "0");

            Console.WriteLine();
        }
    }
}
Nach dem Login kopieren

In diesem Code:

  • Bitfelder werden mithilfe von definiert [BitfieldLength(uint-Länge)]-Attribut.
  • PrimitiveConversion-Klasse stellt ein ToLong Methode zum Konvertieren der Bitfelder in einer Struktur in eine lange Ganzzahl.
  • PESHeader ist eine Struktur mit sechs Bitfeldern.
  • Die Funktion Main() initialisiert die PESHeader-Struktur und konvertiert sie in eine lange Ganzzahl .
  • Die Bitdarstellung der langen Ganzzahl wird dann auf der Konsole ausgegeben.

Dieser Ansatz ermöglicht eine einfache Manipulation von Bitfelder, was es besonders nützlich für den Umgang mit bitorientierten Datenformaten macht.

Das obige ist der detaillierte Inhalt vonWie können Bitfelder in C# mithilfe von Attributen implementiert und darauf zugegriffen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage