>백엔드 개발 >C++ >속성을 사용하여 C#에서 비트 필드를 어떻게 구현하고 액세스할 수 있습니까?

속성을 사용하여 C#에서 비트 필드를 어떻게 구현하고 액세스할 수 있습니까?

DDD
DDD원래의
2025-01-03 21:29:41984검색

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

C#의 비트 필드

다음 C# 코드는 구조 내에서 비트 필드를 생성하고 도트 연산자를 사용하여 비트 액세스를 활성화하는 방법을 보여줍니다.

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

이에는 코드:

  • 비트 필드는 [BitfieldLength(단위 길이)] 속성을 사용하여 정의됩니다.
  • PrimitiveConversion 클래스는 ToLong 구조체의 비트 필드를 긴 정수로 변환하는 메서드입니다.
  • PESHeader는 6개의 비트 필드를 가진 구조체입니다.
  • Main() 함수는 PESHeader 구조체를 초기화하고 이를 긴 정수로 변환합니다. .
  • 그런 다음 긴 정수의 비트 표현이 콘솔에 인쇄됩니다.

이것은 접근 방식을 사용하면 비트 필드를 쉽게 조작할 수 있으므로 비트 지향 데이터 형식을 처리하는 데 특히 유용합니다.

위 내용은 속성을 사용하여 C#에서 비트 필드를 어떻게 구현하고 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.