Как записать последовательность байтов из файла в байтовый массив без заполнения массива нулевыми байтами? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть

[13,132,32,75,22,61,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

Я хочу

[13,132,32,75,22,61,50]

У меня есть массив байтов размером 1048576, который я записал в поток файлов. Начиная с определенного индекса в этом массиве до конца массива все нулевые байты. Может быть 100000 байтов со значениями и 948576 нулевых байтов в конце массива. Когда я не знаю размер файла, как мне эффективно создать новый массив размером 100000 (т.е. такой же, как общее количество байтов в неизвестном файле) и записать все байты из этого файла в байтовый массив?

byte[] buffer = new byte[0x100000];
int numRead = await fileStream.ReadAsync(buffer, 0, buffer.length); // byte array is padded with null bytes at the end

1 Ответ

1 голос
/ 26 апреля 2020

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

var contents = File.ReadAllText(filePath, Encoding.UTF8);
// contents holds all the text in the file at filePath and no more

или, если хотите, чтобы использовать поток:

using (var sr = new StreamReader(path)) 
{
    // Read one character at a time:
    var c = sr.Read();

    // Read one line at a time:
    var line = sr.ReadLine();

    // Read the whole file
    var contents = sr.ReadToEnd();
}

Если, однако, вы настаиваете на прохождении через буфер, вы не можете избежать того, чтобы часть буфера была пустой (имеющей нулевые байты), когда вы достигнете конца файла, но это где возвращаемое значение ReadAsync сохраняет день:

byte[] buffer = new byte[0x100000];
int numRead = await fileStream.ReadAsync(buffer, 0, buffer.length);

var sectionToDecode = new byte[numRead];
Array.Copy(buffer, 0, sectionToDecode, 0, numRead);
// Now sectionToDecode has all the bytes that were actually read from the file
...