#c_sharp #cpp
На данный вопрос уже ответили: Аналог битового поля на C# 1 ответ Помогите разобраться, что значит : В переменной ниже приведу структуру на С++ Builder: typedef struct { unsigned int nr:8; // unsigned int y:8; // 1 unsigned int sm:3; // 2 unsigned int d:5; // 3 unsigned int m:4; // 4 unsigned int r:4; // 5 } n_def; Что именно значит число после :? nr:8 или 3 или 5 ..... и т.д.? И как тоже самое реализовать на C#? Дело в том что мне нужно прочитать данные из бинарного файла, и как я понял мне для начала нужно прочитать весь блок а затем разбить его на биты ? в C# чтение производиться так: using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))) { // пока не достигнут конец файла // считываем каждое значение из файла while (reader.PeekChar() > -1) { int numb = reader.ReadInt32(); uint nr = reader.ReadUInt32(); // переменная которую нужно разбить на биты } } Я правильно понял ? как правильнее реализовать ? может лучше использовать маршалинг ? Спасибо за ваши ответы
Ответы
Ответ 1
Двоеточие применяется для того, чтобы указать размер переменной в битах. Такая запись работает только внутри структур, где несколько небольших значений из 2-х или 3-х бит могут быть слиты в одну 16, 32 или 64-хбитовую целую переменную. В вашем примере все переменные поместятся в 32-хбитовое целое число. В действительности это и будет одна целая переменная, а компилятор сгенерирует вам код для доступа к отдельным битам. На C#, как и в C++ вместо такой записи часто применяют прямую манипуляцию битами. Например, чтобы выделить три бита, начиная с пятого, вы делаете так: var y = (x >> 4) & 0x07; Сначала вы сдвигаете число на 4 бит вправо, теряя младшие 4 бита. Затем накладываете маску 000001112, стирая старшие 5 бит и оставляя младшие 3. В результате вы получаете три бита: пятый, шестой и седьмой. Чтобы установить эти биты вы можете сначала стереть их, а затем применить операцию ИЛИ: var y = (y & 0x8F) | (x << 4); Здесь 0x8F это 100011112, а х содержит новое значение для этих 3-х бит. Впрочем, в C# есть структура BitVerctor32, которая поможет работать с отдельными битами или группами бит.
Комментариев нет:
Отправить комментарий