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

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

10 голосов
/ 25 февраля 2011

Мне нужно перевести структуру C в C #, который использует битовые поля.

typedef struct foo  
{  
    unsigned int bar1 : 1;
    unsigned int bar2 : 2;
    unsigned int bar3 : 3;
    unsigned int bar4 : 4;
    unsigned int bar5 : 5;
    unsigned int bar6 : 6;
    unsigned int bar7 : 7;
    ...
    unsigned int bar32 : 32;
} foo;

Кто-нибудь знает, как это сделать, пожалуйста?

Ответы [ 4 ]

5 голосов
/ 15 мая 2013

Как объяснено в этом ответе и в этой статье MSDN , вы можете искать следующее вместо BitField

[Flags]
enum Foo
{
    bar0 = 0,
    bar1 = 1,
    bar2 = 2,
    bar3 = 4,
    bar4 = 8,
    ...
}

, поскольку это можетбыть немного раздражающим, чтобы вычислить до 2 32 , вы также можете сделать это:

[Flags]
enum Foo
{
    bar0 = 0,
    bar1 = 1 << 0,
    bar2 = 1 << 1,
    bar3 = 1 << 2,
    bar4 = 1 << 3,
    ...
}

И вы можете получить доступ к своим флагам, как вы ожидаете в C:

Foo myFoo |= Foo.bar4;

и C # в .NET 4 бросают вам кость с помощью метода HasFlag().

if( myFoo.HasFlag(Foo.bar4) ) ...
3 голосов
/ 25 февраля 2011

Вы можете использовать класс BitArray для фреймворка. Посмотрите на статью msdn .

0 голосов
/ 25 февраля 2011

К сожалению, в C # такого нет. Наиболее близким является применение атрибута StructLayout и использование атрибута FieldOffset для полей. Однако смещение поля указывается в байтах , а не в битах. Вот пример:

[StructLayout(LayoutKind.Explicit)]
struct MyStruct
{
    [FieldOffset(0)]
    public int Foo; // this field's offset is 0 bytes

    [FieldOffset(2)]
    public int Bar; // this field's offset is 2 bytes. It overlaps with Foo.
}

Но это НЕ то, что вам нужно.

Если вам нужно декодировать последовательность битов в структуру, вам придется написать код вручную (например, с помощью таких классов, как MemoryStream или BitConverter).

0 голосов
/ 25 февраля 2011

Вы ищете атрибут FieldOffset?Смотрите здесь: FieldOffsetAttribute Class

...