Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 16.08.2018
Сообщений: 23

Чтение структурированной информации из бинарного файла

16.08.2018, 22:11. Показов 2907. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно написать на C# код для считывания информации из следующего файла?

Header Block Format
The header block uses the following format (in C syntax):

C++
1
2
3
int version, type, lens_units, source_units, source_multiplier;
int i_data[50];
double d_data[50];
i_data[0], i_data[1]: number of x pixels, number of y pixels.
i_data[2], i_data[3]: number of rays striking the spatial detector, number of rays striking the angular detector.
d_data[0], d_data[1]: x half width of the detector, the y half width of the detector.
d_data[2] - d_data[5]: angular x minimum, x maximum, y minimum, y maximum.

Data Block Format
After the header data is defined and written to the file, the data structures are written. One data block is written for each pixel on the detector. The file formats for the data structures depends upon the detector type as follows.
Data Structure For Detector Rectangle Objects:
double inc_int_pos, inc_int_ang, coh_real, coh_imag, coh_amp;


Note that when reading detector data files in other programs, there is a gap of 4 bytes that appears between the last int member (i_data) and the first double member (d_data). That typical “C” structures in Windows are packed on 8 byte boundaries. This packing means that 2-byte members are aligned on a memory address that is an integer multiple of 2, 4-byte members are aligned on multiples of 4, and 8-byte members are aligned on multiples of 8. This packing speeds memory access but can create some small gaps in the structures. That is why structure sizes can be slightly larger than the sum of the byte sizes of all the members.

Пока не выходит ничего, сложно начинать с таких задач...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2018, 22:11
Ответы с готовыми решениями:

Чтение из файла структурированной информации
Такая вот проблема. Есть следующий файл Черепаха Собака СобакаСлонКомарГепард Гепард Жираф Комар Собака #$end Черепаха ...

Чтение с файла структурированной информации
Вот код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; struct shop {...

Считывание с файла структурированной информации
Всем привет! Вопрос по парсингу возник в файле есть данные в следующем виде: mdpQuestData = { = { = "", =...

14
418 / 316 / 241
Регистрация: 29.05.2010
Сообщений: 796
Записей в блоге: 1
17.08.2018, 08:06
ilia_71, у вас нет примера файла?
0
Эксперт .NET
 Аватар для Rius
13008 / 7607 / 1663
Регистрация: 25.05.2015
Сообщений: 23,149
Записей в блоге: 14
17.08.2018, 08:12
Лучший ответ Сообщение было отмечено ilia_71 как решение

Решение

Создаёте FileStream к файлу.
Передаёте его в BinaryReader.
Им уже читаете
Цитата Сообщение от ilia_71 Посмотреть сообщение
int version, type, lens_units, source_units, source_multiplier;
как Int32;
Цитата Сообщение от ilia_71 Посмотреть сообщение
int i_data[50];
как Int32, в цикле 50 раз, собирая в массив.
Цитата Сообщение от ilia_71 Посмотреть сообщение
double d_data[50];
как Double, в цикле 50 раз, собирая в массив.
Примеры использования есть в справке.

Цитата Сообщение от ilia_71 Посмотреть сообщение
Пока не выходит ничего, сложно начинать с таких задач...
Ничего не выходит у того, кто ничего не делает.
1
0 / 0 / 0
Регистрация: 16.08.2018
Сообщений: 23
17.08.2018, 08:27  [ТС]
kypiwindy,
Есть, вложил
Вложения
Тип файла: 7z DDR_1.7z (1.75 Мб, 12 просмотров)
0
0 / 0 / 0
Регистрация: 16.08.2018
Сообщений: 23
17.08.2018, 08:30  [ТС]
Rius,
Спасибо.
Цитата Сообщение от Rius Посмотреть сообщение
Ничего не выходит у того, кто ничего не делает.
Даже не поспоришь... Потыкался пару часов, но опыта мало... Почитал форумы - запутался еще больше...
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
17.08.2018, 08:36
Рядом тред смотрите Чтение из бинарного файла в структуру

Добавлено через 1 минуту
Для начала просто создайте текстовый файл и простую структуру в 2-3 символа и попробуйте написать пример чтения.
0
Эксперт .NET
 Аватар для Usaga
14099 / 9316 / 1349
Регистрация: 21.01.2016
Сообщений: 34,991
17.08.2018, 09:02
Цитата Сообщение от ilia_71 Посмотреть сообщение
Потыкался пару часов, но опыта мало... Почитал форумы - запутался еще больше...
Вам товарищ Rius назвал волшебные слова, которые вам помогут. И даже ссылки дал. Осталось перейти по ним и изучить материал внимательно.
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
17.08.2018, 10:15
Rius, Подскажите, а в чем отличие такого метода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int[] i_data = new int[50];
        double[] d_data = new double[50];
 
        using (BinaryReader fr = new BinaryReader(File.Open("file.bin",FileMode.OpenOrCreate, FileAccess.Read, FileShare.None)))
        {
            
                int version = fr.ReadInt32();
                int type = fr.ReadInt32();
                int lens_units = fr.ReadInt32();
                int source_units = fr.ReadInt32();
                int source_multiplier = fr.ReadInt32();
 
                for (int i = 0; i < 49; i++)
                {
                    
                    i_data[i] = fr.ReadInt32();
                    d_data[i] = fr.ReadDouble();
                }
                         
            fr.Close();
        }
от метода с созданием структуры ?
0
Эксперт .NET
 Аватар для Rius
13008 / 7607 / 1663
Регистрация: 25.05.2015
Сообщений: 23,149
Записей в блоге: 14
17.08.2018, 11:02
В 1 посте массивы идут один за другим, поэтому код уже нерабочий.

Разница в уровне прибитости гвоздями. Результат же может быть одинаков.
В коде можно считать часть данных и подумать, как и что надо считывать дальше.
Структура загружается полностью, она должна заранее точно соответствовать структуре же загружаемых бинарных данных.

На этом примере разницы вы не увидите. А когда придётся считывать бинарные данные, которые могут быть разного формата (версии), это всплывёт во всей красе.
2
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
17.08.2018, 11:05
Rius, Что в моем коде ошибка я знаю. Писал просто, что бы объяснить подход. Спасибо за объяснение.
0
0 / 0 / 0
Регистрация: 16.08.2018
Сообщений: 23
18.08.2018, 09:28  [ТС]
Такой код читает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace BinaryReader_Class
{
    class Program
    {
        public struct FILEHEADER
        {
            public Int32 version, type, lens_units, source_units, source_multiplier; 
            //public Int32 type; 
            //public Int32 lens_units; 
            //public Int32 source_units; 
            //public Int32 source_multiplier;
            public int[] i_data;
            public double[] d_data;
        }
        public struct FILEDATA
        {
            public double[] inc_int_pos, inc_int_ang, coh_real, coh_imag, coh_amp;
        }
        static void Main(string[] args)
        {
//          WriteBinaryFile(); 
//            ReadBinaryFile();
            ReadBinaryFile2();
            Console.ReadKey();
        }
        static void ReadBinaryFile2()
        {
            string Filenameis = "F:\\Projects\\Eximo\\DDR_1.DDR";
            FileStream fileStream = File.OpenRead(Filenameis);
            BinaryReader file = new BinaryReader(fileStream);
            FILEHEADER head;
            head.i_data = new int[50];
            head.d_data = new double[50];
            head.version = file.ReadInt32();
            head.type = file.ReadInt32();
            head.lens_units = file.ReadInt32();
            head.source_units = file.ReadInt32();
            head.source_multiplier = file.ReadInt32();
            for (int i = 0; i < 49; i++)
            {
                head.i_data[i] = file.ReadInt32();
            }
            file.ReadDouble();
            for (int i = 0; i < 49; i++)
            {
                head.d_data[i] = file.ReadDouble();
            }
            int totalpixels;
            totalpixels = head.i_data[0] * head.i_data[1];
            FILEDATA data;
            data.inc_int_pos = new double[totalpixels];
            data.inc_int_ang = new double[totalpixels]; 
            data.coh_real = new double[totalpixels];
            data.coh_imag = new double[totalpixels];
            data.coh_amp = new double[totalpixels];
            for (int i = 0; i < totalpixels-1; i++)
            {
                data.inc_int_pos[i] = file.ReadDouble();
                data.inc_int_ang[i] = file.ReadDouble();
                data.coh_real[i] = file.ReadDouble();
                data.coh_imag[i] = file.ReadDouble();
                data.coh_amp[i] = file.ReadDouble();
            }
 
            // head info:
            Console.WriteLine("Version : " + head.version);
            Console.WriteLine("type : " + head.type);
            Console.WriteLine("lens_units : " + head.lens_units);
            Console.WriteLine("source_units : " + head.source_units);
            Console.WriteLine("source_multiplier : " + head.source_multiplier);
            Console.WriteLine("number of x pixels: " + head.i_data[0]);
            Console.WriteLine("number of y pixels: " + head.i_data[1]);
            Console.WriteLine("x half width: " + head.d_data[0]);
            Console.WriteLine("y half width: " + head.d_data[1]);
            Console.WriteLine("angular x minimum: " + head.d_data[2]);
            Console.WriteLine("angular x maximum: " + head.d_data[3]);
            Console.WriteLine("angular y minimum: " + head.d_data[4]);
            Console.WriteLine("angular y maximum: " + head.d_data[5]); 
            // data info 
            Random rnd = new Random();
            for (int i = 0; i < 10; i++)
            {
                int j = rnd.Next(1, totalpixels-1);
                Console.WriteLine("data of pixel " + j + " is "+  data.inc_int_pos[j]);
            }
            double totalpower = 0;
            for (int i = 0; i < totalpixels - 1; i++)
            {
                totalpower += data.inc_int_pos[i];
            }
            Console.WriteLine("Power: " + totalpower);
        }
    }
}
1. Данные для HEADER верные, а вот в DATA я не уверен, нет ли где ошибки? Посмотрите, пожалуйста.
2. Как записать измененные данные в новый файл?
0
Эксперт .NET
 Аватар для Rius
13008 / 7607 / 1663
Регистрация: 25.05.2015
Сообщений: 23,149
Записей в блоге: 14
18.08.2018, 09:54
using() {} используйте для объектов, поддерживающих IDisposable.
Цитата Сообщение от ilia_71 Посмотреть сообщение
for (int i = 0; i < 49; i++)
Должно быть < 50.
0 <= i < 5 даст перечень { 0, 1, 2, 3, 4 }, т.е. 5 чисел.
Дальше ещё несколько таких ошибок.

Лишнее чтение:
Цитата Сообщение от ilia_71 Посмотреть сообщение
}
file.ReadDouble();
for (int i = 0; i < 49; i++)
Принцип чтения вы поняли. Соответствие формату данных проверяйте сами, используя внимательность на полную.

Запись производится аналогично. Только BinaryWriter и методы записи вместо чтения.
1
0 / 0 / 0
Регистрация: 16.08.2018
Сообщений: 23
18.08.2018, 10:19  [ТС]
Rius, спасибо!
С <50 данные сошлись (сумма).
В оригинальном формате указываться, что есть разрыв в 4 байта между i_data и d_data. Правильно ли я делаю, вставляя "пустое чтение" file.ReadInt32() между массивами? Что в этом случае делать при записи?
0
Эксперт .NET
 Аватар для Rius
13008 / 7607 / 1663
Регистрация: 25.05.2015
Сообщений: 23,149
Записей в блоге: 14
18.08.2018, 10:22
Цитата Сообщение от ilia_71 Посмотреть сообщение
Правильно ли я делаю, вставляя "пустое чтение" file.ReadInt32() между массивами?
Да, так можно прокрутить файловый курсор на нужное число байт.
Цитата Сообщение от ilia_71 Посмотреть сообщение
Что в этом случае делать при записи?
Записать нули. (UInt32)0 или byte [] {0, 0, 0, 0}.
0
0 / 0 / 0
Регистрация: 16.08.2018
Сообщений: 23
18.08.2018, 13:12  [ТС]
Rius, еще раз спасибо!
Все работает, обработанные данные открываются и в оригинальной программе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2018, 13:12
Помогаю со студенческими работами здесь

Считывание из текстового файла структурированной информации
Файл имеет следующий вид: Фамилия Имя Отчество возраст рез. экзамена рез. прыжка в длину Фамилия Имя Отчество возраст рез. экзамена...

Переписать код с C# - чтение информации из бинарного файла
Есть код приведенный на одном из стороннем форуме, который читает данные из бинарного файла. Как мне его под билдер переписать? Вот...

Чтение информации для вектора структур, из бинарного файла
Добрый день, есть у меня класс, что-то вроде электронного реестра, данные хранятся в виде структуры, а те, в свою очередь, помещены в...

Вывод структурированной информации из файла в DataGridView
привет1 есть файл name.txt. В нем текст организован: ИМЯ ФАЙЛА#ОБОЗНАЧЕНИЕ#ЛИСТ#НАИМЕНОВАНИЕ#ТИП ДОКУМЕНТА#ЛИТЕРА#ДАТА ЛИТЕРЫ#ФОРМАТ...

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void ATS44Encoder::FileEncode() { QFile* file = new...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru