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
Libérer: 2025-01-03 21:29:41
original
999 Les gens l'ont consulté

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();
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal