Maison >développement back-end >C++ >Comment les champs de bits peuvent-ils être implémentés et accessibles en C# à l'aide d'attributs ?

Comment les champs de bits peuvent-ils être implémentés et accessibles en C# à l'aide d'attributs ?

DDD
DDDoriginal
2025-01-03 21:29:41984parcourir

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

Champs de bits en C#

Le code C# suivant montre comment créer des champs de bits dans une structure, permettant l'accès aux bits à l'aide de l'opérateur point.

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();
        }
    }
}

Dans ce code :

  • Les champs de bits sont définis à l'aide du Attribut [BitfieldLength(uint length)].
  • La classe PrimitiveConversion fournit un attribut ToLong méthode pour convertir les champs de bits d'une structure en un entier long.
  • PESHeader est une structure avec six champs de bits.
  • La fonction Main() initialise la structure PESHeader et la convertit en un entier long. .
  • La représentation binaire de l'entier long est ensuite imprimée sur la console.

Ceci Cette approche permet une manipulation facile des champs de bits, ce qui la rend particulièrement utile pour gérer les formats de données orientés bits.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn