Лучший способ представить битовые массивы в C #? - PullRequest
1 голос
/ 19 апреля 2010

Я сейчас создаю класс 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. Передовой метод

способ представления этого каккласс ???

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

Ответы [ 3 ]

11 голосов
/ 19 апреля 2010

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

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

BitArray op = new BitArray(8);

(выше будет 8 бит и должен занимать 1 байт)

4 голосов
/ 19 апреля 2010

Вы ошиблись с этим, это не битовый вектор. Сообщение определено в «октетах», более известных как «байты». Эквивалентное объявление 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;
    }

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

2 голосов
/ 19 апреля 2010

Вы уверены, что хотите использовать битовые массивы для некоторых из них? Например, вы можете использовать байт для 8 битов, int для 32 битов и байтовые массивы для фрагментов, которые отображаются в строки с нулевым символом в конце, например, '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

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

...