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

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

29.05.2019, 11:43. Показов 9895. Ответов 90
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой следующего рода: читаю dat файл, все читает нормально, пока дело не доходит до ReadString. Почему-то, вместо одной строки, он перепрыгивает и читает несколько. Я знаю длину, строки - равна 20 байтам. Как использовать длину, что бы все правильно читало?
C#
1
2
3
4
5
6
7
8
9
{
                   byte length = br.ReadByte();
                Console.WriteLine("Длинна надписи: " + length);
                string fieldName = br.ReadString();//вот от-сюда собственно и начинает проблема
                Console.WriteLine("Надпись: " + fieldName);
                byte type = br.ReadByte();
                Console.WriteLine(" Размер шрифта: " + type);
                
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2019, 11:43
Ответы с готовыми решениями:

Чтение бинарного файла
проблема с чтением бинарного файла. если сделать так: byte buf_data = new byte; file.Read(buf_data, 0, 10); то в таком случае...

Чтение бинарного файла
Добрый день, подскажите как реализовать код. Имеется структура бинарного файла (не моего) нужно его прочесть. Структура: ...

Некорректное чтение из бинарного файла
Здравствуйте У меня следующая ситуация: 1) Создаю бинарный файл using (FileStream stream = new...

90
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
29.05.2019, 14:20  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Rius Посмотреть сообщение
Один из
Помогло, спасибо, за помощь и терпение.
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
29.05.2019, 14:25
C#
1
string name = Encoding.ASCII.GetString(br.ReadBytes(30)).Trim();
Чтобы пробелы убрать.
0
HF
 Аватар для HF
1344 / 928 / 202
Регистрация: 09.09.2011
Сообщений: 2,757
Записей в блоге: 2
29.05.2019, 14:51
Цитата Сообщение от HF Посмотреть сообщение
А ещё у меня предположение, что это кастомный формат - который в себя включает и описание полей - тип, название, длина, размер(что это?). Тогда вообще нужно всё читать только байтами и самому раскидывать по полям данных.
Цитата Сообщение от Rius Посмотреть сообщение
string name = Encoding.ASCII.GetString(br.ReadBytes(30 ));
Тогда уж в примере с кодом
C#
1
2
3
4
byte length = br.ReadByte();
Console.WriteLine("Length Field: " + length);
string fieldName = br.ReadString();
Console.WriteLine("Field name: " + fieldName);
заменить на:
C#
1
2
3
4
byte length = br.ReadByte();
Console.WriteLine("Length Field: " + length);
string fieldName = Encoding.ASCII.GetString(br.ReadBytes(length));
Console.WriteLine("Field name: " + fieldName);
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
29.05.2019, 15:02
HF, а позицию смещать на оставшееся после строки количество пробелов кто будет в таком случае?
0
HF
 Аватар для HF
1344 / 928 / 202
Регистрация: 09.09.2011
Сообщений: 2,757
Записей в блоге: 2
29.05.2019, 16:01
Цитата Сообщение от Someone007 Посмотреть сообщение
а позицию смещать на оставшееся после строки количество пробелов кто будет в таком случае?
Вопрос понятен и верен но, учитывая странную структуру файла, все наши варианты будут тогда неправильные.
В случае с примером откуда мы знали что это строка и там 30 байт? А если там 10 пробелов кто-то написал? или слово начинается с пробелов?
Цитата Сообщение от Rius Посмотреть сообщение
string name = Encoding.ASCII.GetString(br.ReadBytes(30 )).Trim();
Я же прочёл именно то как записано в структуре. "Как сказано, так и сделал".

Если не использовать поля типа "Field X Length", то какой в них тогда вообще смысл? Ну только если обрезать правильно (вместо Trim)
C#
1
string fieldName = Encoding.ASCII.GetString(br.ReadBytes(30), 1, length);
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
29.05.2019, 16:32
Цитата Сообщение от HF Посмотреть сообщение
заменить на:
HF, в этом файле длина строки вообще не прописана, а прибита гвоздями: == 30 байтам. Ничего заменять не надо.

Цитата Сообщение от HF Посмотреть сообщение
А если там 10 пробелов кто-то написал? или слово начинается с пробелов?
То Trim() все пробелы в начале и конце подчистит.
Цитата Сообщение от HF Посмотреть сообщение
В случае с примером откуда мы знали что это строка и там 30 байт?
Из куцего описания, данного ТС'ом. Подробнее - надо раскалёнными клещами вытягивать.
Цитата Сообщение от HF Посмотреть сообщение
учитывая странную структуру файла
Вполне обычная структура. Записи фиксированной длины.
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 10:45  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Вполне
Добрый день. Жутко извиняюсь, но, может согласитесь помочь ещё раз. В данном куске кода, я читаю строку и привожу к 16-ричному виду. Как это можно сделать по-другому?
C#
1
2
3
4
5
    string userData = br.ReadByte().ToString("X2");
    string userData1 = br.ReadByte().ToString("X2");
    string userData2 = br.ReadByte().ToString("X2");
    string userData3 = br.ReadByte().ToString("X2");
    Console.WriteLine("User Data: {0} {1} {2} {3} ", userData, userData1, userData2, userData3);
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
30.05.2019, 10:53
C#
1
2
var b = br.ReadBytes(4);
Console.WriteLine("User Data: {0:X2} {1:X2} {2:X2} {3:X2} ", b[3], b[2], b[1], b[0]);
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 10:58  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
var
А если он занимает 30 байт? Я понимаю, что так можно и 30, но как-то короче или универсальнее,может быть?
Миниатюры
Чтение строки из бинарного файла  
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
30.05.2019, 11:03
Лучший ответ Сообщение было отмечено Muhusii как решение

Решение

C#
1
2
var b = br.ReadBytes(30);
Console.WriteLine("User Data: {0} ", string.Join(" ", b.Select(x => x.ToString("x2"))));
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 11:18  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
var b = br.ReadBytes(30);
Спасибо, работает. Но, дело в том, что выделено для этого 100, а занимает не 30(прощу прощения, ошибся), а 16.Получается, если я буду читать 16, то дальше чтение нарушается, а если 100, то он и читает все 100 но получается каша. Условно, нужно прочеть 100, а вывести 16. Крайне извиняюсь, если я вам надоел.
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
30.05.2019, 11:26
Лучший ответ Сообщение было отмечено Muhusii как решение

Решение

C#
1
.... b.Take(16).Select(...........
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 11:49  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
b.Take(16).Select
А еще есть какие-то способы? У меня несколько повторяющихся структур и я хочу запихнуть все это в цикл. Только везде разные данные, и вот в некоторых нет хэш-кода. И получается, вместо пустой строки, он заполняет ее 20(на картинке). Как я понимаю, это просто пробелы.
Изображения
 
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
30.05.2019, 11:52
Цитата Сообщение от Muhusii Посмотреть сообщение
А еще есть какие-то способы?
А чем этот не нравится? По какому именно признаку другой метод нужен?
Цитата Сообщение от Muhusii Посмотреть сообщение
И получается, вместо пустой строки, он заполняет ее 20(на картинке). Как я понимаю, это просто пробелы.
Пробелы. Строка без пробелов получается вызовом Trim().
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 11:57  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Пробелы
Да, я первым делом попробовал Trim(), но немного не разобрался куда его там нужно поставить. Это нравится, но вот проблема с пробелами.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
30.05.2019, 12:00
Цитата Сообщение от Muhusii Посмотреть сообщение
Да, я первым делом попробовал Trim(), но немного не разобрался куда его там нужно поставить. Это нравится, но вот проблема с пробелами.
У вас же указана длинна 0, так делайте b.Take(length/*0*/) и не будет пробелов.
0
Эксперт .NET
 Аватар для Rius
13830 / 7902 / 1708
Регистрация: 25.05.2015
Сообщений: 23,997
Записей в блоге: 14
30.05.2019, 12:01
Muhusii, в чём проблема с пробелами?
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 12:04  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
У вас же указана длинна 0
Я хочу запихнуть код в цикл, так как у меня несколько одинаковых структур, с разными значениями. То есть, где то 0, а где-то 3, а где-то 16. Конечно, можно для каждой структуры сделать отдельно, но мне кажется, проще в цикле.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
30.05.2019, 12:06
Цитата Сообщение от Muhusii Посмотреть сообщение
Я хочу запихнуть код в цикл, так как у меня несколько одинаковых структур, с разными значениями. То есть, где то 0, а где-то 3, а где-то 16. Конечно, можно для каждой структуры сделать отдельно, но мне кажется, проще в цикле.
Какая разница цикл/не цикл, у вас же длинна указана в самом файле как я понимаю...
0
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 35
30.05.2019, 12:13  [ТС]
Rius, может я не так выразился. Как я говорил, я хочу запихнуть код в цикл, что бы он делал несколько проходов. Мне нужно что бы строка Right Set выводилось пустой в этом случае,а в другом заполненной.

Добавлено через 2 минуты
Someone007, если я помещу это в цикл, то он будет выводить пустую строку во всех случаях. Длинна известна, но вместо всех выделенных 100 байт, заполнены не все.
C#
1
2
 var rightSet = br.ReadBytes(100);
 Console.WriteLine("Right Set: {0}", string.Join(" ", rightSet.Take(0).Select(x => x.ToString("x2"))));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2019, 12:13

Чтение структуры из бинарного файла
Всем добрый день, столкнулся с проблемой чтения структур из бинарного файла, много чего нового узнал и много в чем еще не разобрался, ниже...

Чтение из бинарного файла в структуру
Совсем недавно начал изучать C# и .NET до этого программировал на C++. Хотел узнать можно ли через прямое обращение к памяти считать данные...

Чтение значений из бинарного файла
Здравствуйте! И вот, опять, прошу помощи у сообщества :-Вот здесь). Не могли бы вы, пожалуйста, подсобить примером кода (я прошу...

Чтение и запись бинарного файла
Помогите объяснить и переделать не большую программу с VB6 , на C#. А то перечитал много книг , но все равно некоторые моменты никак не...

Чтение бинарного файла по заголовкам
Здравствуйте. Файл начинается так 00 00 00 00 FF FF 95 05 34 E8 02 00 CD 67 5A 41 первые 4 байта это номер записи потом 2 байта - номер...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru