Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Medan Bit Boleh Dilaksanakan dan Diakses dalam C# Menggunakan Atribut?

Bagaimanakah Medan Bit Boleh Dilaksanakan dan Diakses dalam C# Menggunakan Atribut?

DDD
Lepaskan: 2025-01-03 21:29:41
asal
983 orang telah melayarinya

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

Bidang Bit dalam C#

Kod C# berikut menunjukkan cara mencipta medan bit dalam struktur, membolehkan akses bit menggunakan pengendali titik.

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();
        }
    }
}
Salin selepas log masuk

Dalam kod ini:

  • Bidang bit ditakrifkan menggunakan atribut [BitfieldLength(uint length)].
  • Kelas PrimitiveConversion menyediakan ToLong kaedah untuk menukar medan bit dalam struktur kepada integer panjang.
  • PESHeader ialah struktur dengan enam medan bit.
  • Fungsi Utama() memulakan struktur PESHeader dan menukarkannya kepada integer panjang .
  • Perwakilan bit bagi integer panjang kemudian dicetak ke konsol.

Pendekatan ini membolehkan manipulasi medan bit yang mudah, menjadikannya amat berguna untuk mengendalikan format data berorientasikan bit.

Atas ialah kandungan terperinci Bagaimanakah Medan Bit Boleh Dilaksanakan dan Diakses dalam C# Menggunakan Atribut?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan