С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 21.11.2016
Сообщений: 11
1

Считать побайтно файл неизвестного формата зная его структуру

21.11.2016, 14:21. Показов 2582. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся с проблемой, нужно считать файл, у файла не прописано расширение, известна байтовая структура:
заголовок файла:

1 байт: версия формата файла (значение 13)
2 байта: момент начала формирования файла
1 байт: последние две цифры года (остаток от деления года на 100)
1 байт: номер месяца (от 1 до 12)
1 байт: день (от 1 до 31)
1 байт: час (от 0 до 23)
1 байт: минута (от 0 до 59)
1 байт: секунда (от 0 до 59)
2 байта: коэффициент входных напряжений
2 байта: коэффициент выходных напряжений
2 байта: коэффициент фазных токов
2 байта: коэффициент нулевого тока
2 байта: коэффициент активной мощности
2 байта: коэффициент реактивной мощности
2 байта: коэффициент оперативного напряжения
4 байта: причина формирования файла
---
27 байтов


После заголовка файла идут записи следующей структуры:

1 байт: количество прошедших после предыдущей записи половинок миллисекунд

2 байта: действующее входное напряжение
2 байта: действующее входное напряжение
2 байта: действующее входное напряжение

2 байта: действующее выходное напряжение
2 байта: действующее выходное напряжение
2 байта: действующее выходное напряжение

2 байта: действующий фазный ток
2 байта: действующий фазный ток
2 байта: действующий фазный ток

2 байта: действующий ток

4 байта: активная мощность
4 байта: реактивная мощность

2 байта: период сетевого напряжения

2 байта: среднее входное напряжение
2 байта: среднее входное напряжение

2 байта: среднее выходное напряжение
2 байта: среднее выходное напряжение

2 байта: средний ток
2 байта: средний ток

2 байта: средний ток

2 байта: оперативное напряжение
---
47 байтов

Не могу понять как произвести считывание, пробовал считывать "ReadAllBytes", считывает все в кашу "*:?:%545выаы"

Был бы весьма благодарен совету
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2016, 14:21
Ответы с готовыми решениями:

Запись в .dbc файл, зная его структуру
Есть 1 dbc файл, его структура такая: public long a; public long b; public bool...

Как открыть бинарный файл, не зная его структуру?
Можно ли как-нибудь открыть бинарный файл, не зная его структуру?

Как побайтно считать файл)
Ув. форумчане!! Скажите пжл как побайтно считать файл и записать его в другой (два .exe файла)....

Подскажите как побайтно считать файл
Читаю файл побайтно seeker=fseek(olddbf,0, SEEK_SET); numread = fread(list, sizeof(char), 16,...

9
Эксперт .NET
6510 / 4086 / 1606
Регистрация: 09.05.2015
Сообщений: 9,553
21.11.2016, 14:28 2
Цикл+BinaryReader.
1
1 / 1 / 0
Регистрация: 21.11.2016
Сообщений: 11
21.11.2016, 14:34  [ТС] 3
Не особо понял как это реализовать
0
Эксперт .NET
6510 / 4086 / 1606
Регистрация: 09.05.2015
Сообщений: 9,553
21.11.2016, 14:40 4
C#
1
2
3
4
5
using(BinaryReader br = new BinaryReader(new FileStream(...)))
{
     var ver = br.ReadByte();
     // и т.д....
}
1
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
21.11.2016, 14:48 5
Цитата Сообщение от PavelP96 Посмотреть сообщение
1 байт: версия формата файла (значение 13)
2 байта: момент начала формирования файла
1 байт: последние две цифры года (остаток от деления года на 100)
1 байт: номер месяца (от 1 до 12)
PavelP96, структуры описать,
потом BinaryReader-ом блоками считывать и в струкутуры переводить

http://stackoverflow.com/quest... o-a-struct
1
1 / 1 / 0
Регистрация: 21.11.2016
Сообщений: 11
21.11.2016, 14:52  [ТС] 6
А дальше получается нужно прописывать все байты? ( Извините за тупые вопросы)
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
21.11.2016, 15:00 7
Лучший ответ Сообщение было отмечено PavelP96 как решение

Решение

Цитата Сообщение от PavelP96 Посмотреть сообщение
После заголовка файла идут записи следующей структуры:
Опишите этот участок (ну и предыдущий )структурами (C# struct)
Потом считали блок данных из файла

C#
1
2
3
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
перевели в структуру
C#
1
2
3
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
это копирую что по ссылке

Добавлено через 3 минуты
вот про структуры https://habrahabr.ru/post/114953/
1
1 / 1 / 0
Регистрация: 21.11.2016
Сообщений: 11
21.11.2016, 15:01  [ТС] 8
Спасибо за ответы, сейчас голова не соображает, завтра попробую вникнуть
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
21.11.2016, 15:14 9
Цитата Сообщение от John999 Посмотреть сообщение
структуры описать
Цитата Сообщение от PavelP96 Посмотреть сообщение
заголовок файла:

1 байт: версия формата файла (значение 13)
2 байта: момент начала формирования файла
1 байт: последние две цифры года (остаток от деления года на 100)
1 байт: номер месяца (от 1 до 12)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[StructLayout(LayoutKind.Explicit)]
public struct Header
{
    [FieldOffset(0)]
    public byte a;   // 1 байт: версия формата файла (значение 13)
    [FieldOffset(1)]
    public short b;    // 2 байта: момент начала формирования файла 
    [FieldOffset(3)]
    public byte c;  // 1 байт: последние две цифры года(остаток от деления года на 100)
    [FieldOffset(4)]
    public byte d;   // 1 байт: номер месяца(от 1 до 12)
 
    ..................... и т.д.
 
    [FieldOffset(...)]
    public int x;   // 4 байта: причина формирования файла
}
1
1 / 1 / 0
Регистрация: 21.11.2016
Сообщений: 11
23.11.2016, 12:45  [ТС] 10
Цитата Сообщение от John999 Посмотреть сообщение
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
А какого типа должна быть переменная "aStruct"?

Добавлено через 8 минут
Извиняюсь, за глупый вопрос, не понял с начала, что это имя структуры

Добавлено через 12 минут
Не совсем понял , все таки, к чему присваиваем
Header temp = (Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Header));

C#
1
2
3
4
5
6
7
8
9
10
11
12
 var currentRow = (FileDep)e.Row;
                var listBytes = File.ReadAllBytes(currentRow.PathFile);
              
 
                //перевод в структуру 
                GCHandle handle = GCHandle.Alloc(listBytes, GCHandleType.Pinned);
                Header temp = (Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Header));
                handle.Free();
 
                string Header = Encoding.UTF8.GetString(listBytes, 0, listBytes.Length);
 
                gridcontrol1.ItemsSource = Header;
Добавлено через 58 минут
Все перемешал

Добавлено через 3 часа 39 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
                var currentRow = (FileDep)e.Row;
                var listBytes = File.ReadAllBytes(currentRow.PathFile);
 
                HeaderMs Ms;
 
                //перевод в структуру 
                GCHandle handle = GCHandle.Alloc(listBytes, GCHandleType.Pinned);
                Ms  = (HeaderMs) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(HeaderMs));
 
                //string g = Encoding.UTF8.GetString(Ms, 0, Ms.Ms);
                gridcontrol1.ItemsSource = Ms;
                handle.Free();
Добавлено через 42 секунды
Нужно как то перевести в строку и вывести в gridcontrol

Добавлено через 23 часа 29 минут
Спасибо, разобрался
0
23.11.2016, 12:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2016, 12:45
Помогаю со студенческими работами здесь

Проверка на существование неизвестного файла, зная лишь его расширение
Задача проста нужно отследить появление файла в папке (путь к ней известен) но вот загвоздка во...

Как побайтно считать бинарник?
Как побайтно считать бинарник? Именно в переменную тип char.

Считать bmp побайтно и пересохранить
необходимо открыть bmp файл, считать заголовок(читаю оба в одну структуру) считать растровый...

Как передать в функцию число и структуру побайтно?
Здравствуйте!!! Нужно написать функцию которая принимает некую структуру и число побайтно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru