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

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

69 голосов
/ 18 августа 2008

У меня есть структура, которую мне нужно заполнить и записать на диск (на самом деле несколько).

Пример:

byte-6    
bit0 - original_or_copy  
bit1 - copyright  
bit2 - data_alignment_indicator  
bit3 - PES_priority  
bit4-bit5 - PES_scrambling control.  
bit6-bit7 - reserved  

В C я мог бы сделать что-то вроде следующего:

struct PESHeader  {
    unsigned reserved:2;
    unsigned scrambling_control:2;
    unsigned priority:1;
    unsigned data_alignment_indicator:1;
    unsigned copyright:1;
    unsigned original_or_copy:1;
};

Есть ли способ сделать это в C #, который позволил бы мне получить доступ к битам с помощью оператора разыменования точки struct?

Для пары структур я могу просто выполнить сдвиг битов, заключенный в функцию доступа.

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

Ответы [ 11 ]

0 голосов
/ 24 апреля 2019

Я чувствую себя довольно комфортно с этими вспомогательными функциями:

uint SetBits(uint word, uint value, int pos, int size)
{
    uint mask = ((((uint)1) << size) - 1) << pos;
    word &= ~mask; //resettiamo le posizioni
    word |= (value << pos) & mask;
    return word;
}

uint ReadBits(uint word, int pos, int size)
{
    uint mask = ((((uint)1) << size) - 1) << pos;
    return (word & mask) >> pos;
}

тогда:

uint the_word;

public uint Itemx
{
    get { return ReadBits(the_word, 5, 2); }
    set { the_word = SetBits(the_word, value, 5, 2) }
}
...