Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234

Как считать последние X байтов файла?

23.04.2015, 22:55. Показов 3659. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу массив байт в файл после обработки (расшифровывания). На выходе получаю файл, который запускается, всё работает, но хеш не совпадает с хешем исходного файла. Как посмотреть что пишется(записано) в конце файла? При обработке маленьких файлов обнаруживал нули в конце. (Они как я понял иногда добавляются для четности) Обрубаю их так: fstream.Write(BYTE_DECR_FILE, 0, Convert.ToInt32(Length_file)); где Length_file - длина исходного файла. Но это в некоторых случаях почему-то не помогает(
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2015, 22:55
Ответы с готовыми решениями:

Как считать и показать последние строки из файла?
есть тхт в котором есть энтое кол-ство строк, как мне сделать чтобы я могу увидеть последние 150 строк текста, но чтобы софт показал текст...

Считать с файла массив байтов максимум по 4мб в строке
Нужно считать массив байтов из файла и превратить в строку. Вот собственно как я это делаю: using (StreamWriter file = new...

Как считать ftp файл в массив байтов?
Stream sw; StreamReader sr; FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://141.8.999.999/ddd/"); ...

14
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
23.04.2015, 23:02
Используете FileStream? Скорее всего в конце вы записываете лишние байты из буфера. Выложите код записи файла, лучше там поправить, чем лепить костыли. Ну если ошибка в этом.
0
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
23.04.2015, 23:13  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
Используете FileStream? Скорее всего в конце вы записываете лишние байты из буфера.
Нет, использую binWriter.Write() Как посмотреть что пишу в конце?

А, неее.. При шифровании binWriter.Write() использую.

А при расшифровывании:
C#
1
2
3
4
5
using (var fstream = File.OpenWrite(OUTPUT_PATH))
                {
                    fstream.Write(BYTE_DECR_FILE, 0, Convert.ToInt32(size_file));
                    fstream.Close();
                }
Добавлено через 8 минут
C#
1
2
3
4
5
using (var fstream = File.OpenWrite(OUTPUT_PATH))
                {
                    fstream.Write(BYTE_DECR_FILE, 0, Convert.ToInt32(size_file));
                    fstream.Close();
                }
Так пишу в файл. Размер получается идентичный исходному файлу, полученный файл полноценно открывается и функционирует, но вот хеш считывается отличный от оригинала(
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
23.04.2015, 23:57
А как вы хэш считаете?
0
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
24.04.2015, 00:06  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
А как вы хэш считаете?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using (var fstream = File.OpenRead(OUTPUT_PATH))
                {
                    string temp = form1_General.GetHash(fstream);
                    byte[] TEMP_HASH_G = form1_General.GetBytesAll(temp);
 
 
                    VerifyMd5Hash = form1_General.ByteArrayCompareWithSequenceEqual(TEMP_HASH_G, BYTE_HASH);
                    if (VerifyMd5Hash)
                    {
                        form2.toolStripStatusLabel1.Text = "Хеш совпал! Файл успешно расшифрован!";
                        MessageBox.Show("Хеш совпал! Файл успешно расшифрован!");
                    }
                    else
                    {
                        form2.toolStripStatusLabel1.Text = "Не удалось расшифровать файл!";
                        MessageBox.Show("Что-то пошло не так!");
                    }
                }

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
public static string GetHash(Stream stream)
        {
            byte[] bytes;
            using (var md5 = new MD5CryptoServiceProvider())
                bytes = md5.ComputeHash(stream);
 
            var buffer = new StringBuilder(bytes.Length * 2);
            foreach (var b in bytes)
                buffer.AppendFormat("{0:x2}", b);
            return buffer.ToString();
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static byte[] GetBytesAll(string str)
        {
            TO_BYTE_ARRAY = ConvertHexToBin(str);
            byte[] result = new byte[TO_BYTE_ARRAY.Length / 8];
            string[] resultParts = new string[TO_BYTE_ARRAY.Length / 8];
            int counter = 0;
 
            for (int i = 0; i < TO_BYTE_ARRAY.Length; i++)
            {
                if ((i % 8 == 0) && (i != 0))
                counter++;
                resultParts[counter] += TO_BYTE_ARRAY[i];
            }
            for (int i = 0; i < result.Length; i++)
            {
                result[i] = Convert.ToByte(resultParts[i], 2);
            }
            return result;
        }
C#
1
2
3
4
public static bool ByteArrayCompareWithSequenceEqual(byte[] p_BytesLeft, byte[] p_BytesRight)
        {
            return p_BytesLeft.SequenceEqual(p_BytesRight);
        }

Сравниваю строки в байтовом представлении, поэтому из строкового приходится переводить.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
24.04.2015, 02:33
DEMON_RUS, по моему методы GetBytesAll и ByteArrayCompareWithSequenceEqual не нужны и код можно переписать так:
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
byte[] TEMP_HASH_G; 
using (var fstream = File.OpenRead(OUTPUT_PATH))
{
    TEMP_HASH_G = form1_General.GetHash(fstream);
    
    VerifyMd5Hash = TEMP_HASH_G.SequenceEqual(BYTE_HASH);
    if (VerifyMd5Hash)
    {
        form2.toolStripStatusLabel1.Text = "Хеш совпал! Файл успешно расшифрован!";
        MessageBox.Show("Хеш совпал! Файл успешно расшифрован!");
    }
    else
    {
        form2.toolStripStatusLabel1.Text = "Не удалось расшифровать файл!";
        MessageBox.Show("Что-то пошло не так!");
    }
}
 
public static byte[] GetHash(Stream stream)
{
    using (var md5 = new MD5CryptoServiceProvider())
    {
        return md5.ComputeHash(stream);
    }
}
1
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
24.04.2015, 10:52  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
TEMP_HASH_G = form1_General.GetHash(fstream);
Тут ошибка - GetHash возвращает строку, а TEMP_HASH_G объявлен как массив байт.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
24.04.2015, 10:59
DEMON_RUS, в моем примере GetHash возвращает byte[] так что никаких ошибок быть не должно.
1
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
24.04.2015, 11:15  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
DEMON_RUS, в моем примере GetHash возвращает byte[] так что никаких ошибок быть не должно.
Разобрался - TEMP_HASH_G = form1_General.GetHash(fstream); - тут вызывалась моя функция из другого места, которая как раз и возвращает строку. Спасибо.

Вопрос про последние байты, записанные в файл, в силе.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
24.04.2015, 11:19
Цитата Сообщение от DEMON_RUS Посмотреть сообщение
Вопрос про последние байты, записанные в файл, в силе.
Функции работы с файлами записывают ровно столько данных сколько им указано. Никакой дозаписи нолей "для четности" они не делают. Проверяй свой код. Где-то вкралась ошибка.
1
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
24.04.2015, 11:26  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Функции работы с файлами записывают ровно столько данных сколько им указано. Никакой дозаписи нолей "для четности" они не делают. Проверяй свой код. Где-то вкралась ошибка.
Дозапись нолей для четности выполняет моя функция, функция работы с файлами работает хорошо.
Мне надо как раз узнать, что добавляет моя функция в конце, когда сформировался массив байт для записи в файл. Я при оперировании с маленькими файлами обнаружил что пишутся нули. Решил проблему как вы мне подсказали:
fstream.Write(BYTE_DECR_FILE, 0, Convert.ToInt32(size_file));
Вроде всё стало отлично работать, но при тестировании файла размером ~150мб файл вроде получается идентичный исходному, но вот хеш их не совпадает( Никак не пойму почему так.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
24.04.2015, 11:28
DEMON_RUS, без кода могу только посоветовать запустить программу под отладчиком и пройти пошагово.
1
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
24.04.2015, 12:09  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
DEMON_RUS, без кода могу только посоветовать запустить программу под отладчиком и пройти пошагово.
А не подскажете:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using (var file = System.IO.File.OpenRead(enc_file))
            {
//Так я помещаю весь файл в buffer
                byte[] buffer = new byte[file.Length];
                file.Read(buffer, 0, buffer.Length);
 
 
//Можно ли аналогично в buffer2 записать последние 10 байт исходного файла?
                byte[] buffer2 = new byte[10];
                file.Read(buffer2, buffer.Length - 10, 10); 
 
//Или второй параметр не указаетль места, с которого будет читаться массив?
            }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
24.04.2015, 12:18
Лучший ответ Сообщение было отмечено DEMON_RUS как решение

Решение

Цитата Сообщение от DEMON_RUS Посмотреть сообщение
Можно ли аналогично в buffer2 записать последние 10 байт исходного файла?
Можно:
C#
1
2
3
byte[] buffer2 = new byte[10];
file.Seek(-10, SeekOrigin.End);
file.Read(buffer2, 0, 10);
Цитата Сообщение от DEMON_RUS Посмотреть сообщение
Или второй параметр не указаетль места, с которого будет читаться массив?
Документация для чего существует? Второй аргумент это индекс внутри массива. Начиная с этой позиции в массив будут записаны данные прочитанные из файла.
1
3 / 2 / 1
Регистрация: 13.05.2013
Сообщений: 234
24.04.2015, 13:02  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Документация для чего существует?
Изучал в школе немецкий, поэтому есть трудности в понимании документации..

Нашел причину:
получил последние 100 байт исходного и расшифрованного файлов как и хотел
C#
1
2
3
byte[] buffer2 = new byte[100];
file.Seek(-100, SeekOrigin.End);
file.Read(buffer2, 0, 100);
и обнаружил, что функция расшифровывания затирает конец нулями почему-то( Неизвестно сколько именно затер, так как в исходном тоже перед концом были нули..
Это уже придется ковырять функцию(

OwenGlendower, спасибо за помощь!
Миниатюры
Как считать последние X байтов файла?   Как считать последние X байтов файла?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2015, 13:02
Помогаю со студенческими работами здесь

Как вырезать часть байтов из файла
public void Delete() { using (FileStream fs = new FileStream(fileUrl, FileMode.Open, FileAccess.Write)) ...

Считать по 4 байта и записать в массив байтов
есть какой то TcpClient который отправляет данные на сервак мне нужно эти данные на сервере считать по 4 байта в один большой массив...

Считать файл и записать данные в массив байтов
Хочу создать класс который считывает файл и записывает данные в массив байтов. Есть следующий код. Требуются поправки. using System; ...

Считать с веб страницы последние пять строк
Привет всем,кто знает как считать с веб страницы ,в которой текст находится по строкам,нижние пять строк,при условии что текст пополняется.

Как менять порядок расположения байтов при чтении бинарного файла?
День добрый! Как в C# менять порядок расположения байтов при чтении? Пож-ста помогите!) Спасибо!


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru