Чтение файла по блокам байтов C#

Рейтинг: 0Ответов: 1Опубликовано: 13.07.2023

мне нужно выполнить задание:

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

Помогите реализовать чтение файла блоками байтов. До этого читал файлы полностью, но если читать БОЛЬШИЕ файлы(*.mp4 и тд), то переполняется массив байтов. Я пытался реализовать чтение кусками данных:

public void CountBytesNew(string filename)
        {
            using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                byte[] bytes = new byte[4096];
                stream.Read(bytes, 0, 4096);
                foreach (byte tmpbyte in bytes) //обрабатываем считанную строку
                {
                    Bytes[tmpbyte]++; //инкрементируем кол-во вхождений байта
                }
            }
        }

Но в результате свободное место массива, инициализированное нулями, все равно потом считывается, и на выходе получаю неверный результат(лишние нулевые байты). Перерыл все форумы и не могу найти что-то наподобие, либо я плохо ищу))) Функцию Read в FileStream немного не понимаю

Ответы

▲ 1Принят

Если правильно понял, то задача состоит в том, чтобы посчитать какой байт сколько раз встречается в файле, если да, то код ниже считает это дело (.net 7):

using var reader = File.OpenRead("file.tmp");
var bytes = new int[256];
var buffer = new byte[4096];
var bytesRead = 0;

while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
    for (int i = 0; i < bytesRead; i++)
    {
        var @byte = buffer[i];
        bytes[@byte]++;
    }
}

В int[] храните количество байт (0 элемент - байт = 0), при чтении просто инкрементируете нужный байт (если его нет - добавляете со значением 1).