:: Не фоксом единым
Re: Переввести в 16-ричный вид
SoccerStudio

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
Меня когда-то за подобный код имели конкретно. Так сказать, прививали уважение к обязательному использованию using применительно к IDisposable.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов
Ratings: 0 negative/1 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Можно - но за счёт этого он станет в 1.5-2 раза медленнее работать на больших файлах
За счёт чего уменьшится быстродействие? Read медленней ReadBytes? В случае Read буфер выделяется явно, потом он заполняется из потока. А в случае с ReadBytes буфер выделяется и заполняется внутри ReadBytes. Чисто визуально, ReadBytes должен работать быстрее.
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
SoccerStudio
Меня когда-то за подобный код имели конкретно.

Вот реальный код, который сейчас в программе:

private string FileToHexStr(string fileName)
{
string response = "";
using (StreamReader streamReader = new StreamReader(fileName))
{
BinaryReader binaryReader = new BinaryReader(streamReader.BaseStream);
byte[] bytes = binaryReader.ReadBytes((int)streamReader.BaseStream.Length);
response = BitConverter.ToString(bytes).Replace("-", " ");
binaryReader.Close();
}
return response;
}

Вот предыдущая версия:

private string FileToHexStr(string fileName)
{
StringBuilder hexOutput = new StringBuilder();
using (StreamReader streamReader = new StreamReader(fileName))
{
BinaryReader binaryReader = new BinaryReader(streamReader.BaseStream);
for (int i = 0; i < streamReader.BaseStream.Length; i++)
{
hexOutput.Append($"{binaryReader.ReadByte():X2} ");
}
binaryReader.Close();
}
return hexOutput.ToString();
}

Пожалуйста, критикуйте.
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вероятно за счёт "динамического" выделения памяти под массив при использовании ReadBytes... Сложно сказать не заглядывая в исходник этих методов
Но я повторюсь - для задач "конвертации" более выгодно будет конвертировать пачками/блоками, а не читая ВЕСЬ файл в память.

По 2-му коду - ну дык BinaryReader тоже IDisposable - а в случае возникновения ошибки твой .Close() так и не сработает - потому и нужен using - ну или его "самописный" аналог на основе try ... finally ...

Опять же код с (int)streamReader.BaseStream.Length априори "нехороший" код - он урезает всё до размеров <= 2Гб. Т.е. подсовываешь твоему конвертеру iso-ник на 3-5Гб и получаешь непредсказуемый/некорректный результат... Это уже чисто "логическая" проблема кода.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
По 2-му коду - ну дык BinaryReader тоже IDisposable

Понял, исправлю!

Igor Korolyov
Т.е. подсовываешь твоему конвертеру iso-ник на 3-5Гб и получаешь непредсказуемый/некорректный результат... Это уже чисто "логическая" проблема кода.

Т.е. txtFile1.BaseStream.Length перед приведением в int надо проверить на размерность? Или, просто в try обернуть?
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
S-type
Т.е. txtFile1.BaseStream.Length перед приведением в int надо проверить на размерность? Или, просто в try обернуть?
Ужос... Приведение к int это делает. Не влезает в него 3-5Гб.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
Т.е. txtFile1.BaseStream.Length перед приведением в int надо проверить на размерность? Или, просто в try обернуть?

Нет, просто переписать код для работы блоками разумного размера (что позволит при желании и террабайтные файлы hex-ифицировать). Ну или в начале кода поставить "стопор" - ежели вышло что подсунули файл больше 2Гб, то вылет с программной ошибкой "такой хоккей нам не нужен"

Есть и более плохой вариант - написать в мануале мелким шрифтом что работа с файлами >2Гб не предусмотрена, и если что то тыкать возмущённому юзеру на этот пункт Так сказать организационно решить программную проблему (но это плохо - так же плохо как и программно решать организационные проблемы).

P.S. Наверное тебя вообще порвёт в тряпки метод File.ReadAllBytes() из System.IO Хотя исходя из вышеизложенного я бы его не советовал применять - ну разве что заказчик клятвенно гарантирует что все обрабатываемые файлики будут мелкими, а памяти на машине будет вагон.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Лично для меня ужас в другом - зачем что бы просто прочитать данные из файла надо использовать StreamReader + BinaryReader? Почему BinaryReader не имеет конструктора с параметром string fileName? Опять таки, почему свойство Length есть у Stream, но его нет у BinaryReader (и приходится выкорябывать его из streamReader.BaseStream.Length)?
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
P.S. Наверное тебя вообще порвёт в тряпки метод File.ReadAllBytes() из System.IO Хотя исходя из вышеизложенного я бы его не советовал применять - ну разве что заказчик клятвенно гарантирует что все обрабатываемые файлики будут мелкими, а памяти на машине будет вагон.

Ага!

private string FileToHexStr2(string fileName)
{
string response = "";
byte[] bytes = File.ReadAllBytes(fileName);
response = BitConverter.ToString(bytes).Replace("-", " ");
return response;
}

Пошёл править программу...
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну потому что у них разные задачи. Вот файл... А если это не файл, а сетевой поток данных? Или файл, но внутри архива? Или просто область в памяти?
Ты еще про FileStream забыл
Разделение функций, однако Один читает именно файл в ФС, а другой трактует прочитанное (из любого "источника", не только файла) как "байтики".
Делать один класс мега-монстр который и файлы, и память, и сокеты, и http-потоки, и изнутри архивов... И заодно трактует прочитанное как байтики, и как строки, и как "форматированные структуры данных"...
В общем это совершенно точно неправильный подход.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Разделение функций, однако

IMHO, какое то кособокое... [тихо ворчу]
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
S-type

Такая вот мысль посетила - можно немного сократить код:

StreamReader txtFile1 = new StreamReader(@"c:\temp\ttt.txt");
BinaryReader binFile1 = new BinaryReader(txtFile1.BaseStream);
byte[] bytes = binFile1.ReadBytes((int)txtFile1.BaseStream.Length);
txtFile1.Close();

Не проще ли
var bytes = File.ReadAllBytes(@"c:\temp\ttt.txt")
Ratings: 0 negative/0 positive
Re: Переввести в 16-ричный вид
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Рома
Не проще ли

Спасибо, Igor Korolyov уже подсказал
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 11 (Гостей: 11)

© 2000-2024 Fox Club 
Яндекс.Метрика