Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Чтение и запись битового поля из\в бинарный файл в C#

#c_sharp #cpp


Всем доброго времени суток, помогите разобраться как прочитать битовое поле из бинарного
файла ? 
Есть структура написанная на C++ 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; 


как я понял мне для начала нужно прочитать весь блок а затем разбить его на биты ?

using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
            {
                // пока не достигнут конец файла
                // считываем каждое значение из файла
                while (reader.PeekChar() > -1)
                {
                    int numb = reader.ReadInt32();
                    uint nr = reader.ReadUInt32(); // переменная которую нужно разбить
на биты 
   }
} 


на втором поле nr я уже получаю не то что нужно. Как правильнее реализовать задачу
? может лучше использовать другой способ чтения и записи в бинарный файл ? Спасибо
за ваши ответы

Продолжение темы : 
Бинарный файл
 ,простите что выкладываю на обменник просто файл содержит данные с 2004г. 



А в VS данные такие : 
nr = 1

y = 16 (совпало)

sm = 2

ds = 15

ms = 11

rs = 0
    


Ответы

Ответ 1



По идее, имеет смысл воспользоваться классом BitVector32. Возьмите вспомогательный класс SectionHelper отсюда. Вам нужно подготовить описание: SectionHelper helper = new SectionHelper(); var nr_s = helper.AllocatedSection(8); var y_s = helper.AllocatedSection(8); var sm_s = helper.AllocatedSection(3); var d_s = helper.AllocatedSection(5); var m_s = helper.AllocatedSection(4); var r_s = helper.AllocatedSection(4); Теперь можно пользоваться. Int32 ndef = reader.ReadInt32(); BitVector32 bv = new BitVector32(ndef); int nr = bv[nr_s]; int y = bv[y_s]; int sm = bv[sm_s]; // ... На запись: BitVector32 bv = new BitVector32(ndef); bv[nr_s] = nr; bv[y_s] = y; bv[sm_s] = sm; // ... Int32 ndef = bv.Data; // и записываете ndef куда надо

Комментариев нет:

Отправить комментарий