Лучший способ представлять битовые массивы в C #?

StackOverflow https://stackoverflow.com/questions/2669307

  •  28-09-2019
  •  | 
  •  

Вопрос

В настоящее время я строю класс DHCPMessage в C #.

RFC доступен здесь: http://www.faqs.org/rfcs/rfc2131.html.

Псевдо

public object DHCPMessage
{
    bool[8] op;
    bool[8] htype;
    bool[8] hlen;
    bool[8] hops;
    bool[32] xid;
    bool[16] secs;
    bool[16] flags;
    bool[32] ciaddr;
    bool[32] yiaddr;
    bool[32] siaddr;
    bool[32] giaddr;
    bool[128] chaddr;
    bool[512] sname;
    bool[1024] file;
    bool[] options;
}

Если мы представляем, что каждое поле является фиксированной длиной битовый массив, что такое:

  1. Самый свободный
  2. Лучшая практика

способ представлять это как класс ???

Или .. Как бы вы написали это? :)

Это было полезно?

Решение

Вы на неверном треке с этим, это не немного вектор. Сообщение определяется в «октетах», более известных как «байты». Эквивалентная декларация C #, которую вы можете использовать с Marshal.ptrtostructure:

    [StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
    struct DHCPMessage {
        public byte op;
        public byte htype;
        public byte hlen;
        public byte hops;
        public uint xid;
        public ushort secs;
        public ushort flags;
        public uint ciaddr;
        public uint yiaddr;
        public uint siaddr;
        public uint giaddr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=16)]
        public byte[] chaddr;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
        public string sname;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
        public string file;
    }

Вам нужно будет обрабатывать поля параметров переменной длины отдельно.

Другие советы

Для начала вы можете попробовать Bitarray сорт. Не нужно изобретать колесо здесь.

Если вы беспокоитесь об этом, занимаясь слишком большим количеством пространства / памяти, не будь. Просто инициализировать его в правильном размере:

BitArray op = new BitArray(8);

(Вышеприведено приведено 8 битов и должно занять 1 байт)

Вы уверены, что хотите использовать битные массивы для некоторых из них? Например, вы можете использовать байт для 8 битов, int для 32 бит и байтовых массивов для кусочков, которые отображают на NULL Transed Strings, такие как «Sname», например. Затем вы можете использовать простые битовые операторы (&, |), чтобы проверить / манипулировать битами.

Вот несколько сообщений, которые я сделал на преобразовании заголовка TCP на структуру, которая также охватывает эндинанс и т. Д.

http://taylorza.blogspot.com/2010/04/archive-structure-from-binary-data.html. http://taylorza.blogspot.com/2010/04/archive-binary-data-from-structure.html.

Это довольно старые, я мигрировал их из моего старого блога, чтобы они не терялись.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top