Битовые поля в C#

Вероятно, ваша кодировка вывода установлена ​​на ASCII. Попробуйте использовать это перед отправкой вывода:

Console.OutputEncoding = System.Text.Encoding.UTF8;

(MSDN link для поддержки документации.)

И вот небольшое тестовое приложение для консоли, которое может оказаться удобным :

C #

using System;
using System.Text;

public static class ConsoleOutputTest {
    public static void Main() {
        Console.OutputEncoding = System.Text.Encoding.UTF8;
        for (var i = 0; i <= 1000; i++) {
            Console.Write(Strings.ChrW(i));
            if (i % 50 == 0) { // break every 50 chars
                Console.WriteLine();
            }
        }
        Console.ReadKey();
    }
}

VB.NET

imports Microsoft.VisualBasic
imports System

public module ConsoleOutputTest 
    Sub Main()
        Console.OutputEncoding = System.Text.Encoding.UTF8
        dim i as integer
        for i = 0 to 1000
            Console.Write(ChrW(i))
            if i mod 50 = 0 'break every 50 chars 
                Console.WriteLine()
            end if
        next
    Console.ReadKey()
    End Sub
end module

Также возможно, что ваш шрифт консоли не поддерживает этот конкретный символ. Нажмите на меню панели инструментов Windows (значок C :.) и выберите «Свойства» -> «Шрифт». Попробуйте другие шрифты, чтобы увидеть, правильно ли они отображают ваш персонаж:

picture of console font edit [/g1]

75
задан Jonathan Leffler 17 December 2015 в 06:53
поделиться

5 ответов

Я, вероятно, столкнул бы что-то с помощью атрибутов, затем класс преобразования для преобразования соответственно приписанных структур в примитивы битового поля. Что-то как...

using System;

namespace BitfieldTest
{
    [global::System.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;

            // For every field suitably attributed with a BitfieldLength
            foreach (System.Reflection.FieldInfo f in t.GetType().GetFields())
            {
                object[] attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false);
                if (attrs.Length == 1)
                {
                    uint fieldLength  = ((BitfieldLengthAttribute)attrs[0]).Length;

                    // Calculate a bitmask of the desired length
                    long mask = 0;
                    for (int i = 0; i < fieldLength; i++)
                        mask |= 1 << 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();

            return;
        }
    }
}

, Который производит ожидаемый... 000101011. Конечно, требуется больше проверки ошибок и немного более нормальный ввод, но понятие (я думаю), звуковой, допускающий повторное использование, и позволяет Вам вывести легко сохраняемые структуры из строя дюжиной.

adamw

53
ответ дан Abhishek 24 November 2019 в 11:38
поделиться

При помощи перечисления Вы можете сделать это, но будете выглядеть неловкими.

[Flags]
public enum PESHeaderFlags
{
    IsCopy = 1, // implied that if not present, then it is an original
    IsCopyrighted = 2,
    IsDataAligned = 4,
    Priority = 8,
    ScramblingControlType1 = 0,
    ScramblingControlType2 = 16,
    ScramblingControlType3 = 32,
    ScramblingControlType4 = 16+32,
    ScramblingControlFlags = ScramblingControlType1 | ScramblingControlType2 | ... ype4
    etc.
}
23
ответ дан angry person 24 November 2019 в 11:38
поделиться

Вы хотите StructLayoutAttribute

[StructLayout(LayoutKind.Explicit, Size=1, CharSet=CharSet.Ansi)]
public struct Foo 
{ [FieldOffset(0)]public byte original_or_copy; 
  [FieldOffset(0)]public byte copyright;
  [FieldOffset(0)]public byte data_alignment_indicator; 
  [FieldOffset(0)]public byte PES_priority; 
  [FieldOffset(0)]public byte PES_scrambling_control; 
  [FieldOffset(0)]public byte reserved; 
}

, Это - действительно объединение, но можно использовать его в качестве битового поля - просто необходимо ощущать то, где в байте биты для каждого поля, как предполагается, находятся. Служебные функции и/или константы к И против могут помочь.

const byte _original_or_copy = 1;
const byte _copyright        = 2;

//bool ooo = foo.original_or_copy();
static bool original_or_copy(this Foo foo) 
{ return  (foo.original_or_copy & _original_or_copy)  == original_or_copy;
}    

существует также LayoutKind. Последовательный, который позволит Вам делать это путь C.

18
ответ дан tanascius 24 November 2019 в 11:38
поделиться

Мог Перечисление со справкой Атрибута Флагов, возможно? Посмотрите здесь:

, Что [Флаги] Перечисление Приписывает средний в C#?

3
ответ дан Community 24 November 2019 в 11:38
поделиться

Перечисление флагов может работать также, я думаю, если Вы делаете его перечислением байта:

[Flags] enum PesHeaders : byte { /* ... */ }
3
ответ дан Mark Cidade 24 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: