MemoryStream: зачем преобразовывать в байты после readByte - PullRequest
13 голосов
/ 29 июля 2011

В этом примере из MS вы заметите, что после того, как мы читаем байт из потока памяти, он переходит в int, который затем должен быть преобразован в байт.Мне кажется странным, что такая функция, как .ReadByte(), не возвращает байт в первую очередь.Есть ли причина, по которой М.С. так поступил?

// Read the remaining bytes, byte by byte.
while(count < memStream.Length)
{
    byteArray[count++] =
        Convert.ToByte(memStream.ReadByte());
}

мне пришла в голову мысль.Возможно, это сводится к использованию.Возможно, ReadByte() часто используется для извлечения коротких длин, а последующие значения используются при извлечении с помощью множества длин

int length=ms.ReadByte();
ms.Read(buf,0,lenth);

, т.е. вы можете использовать длину без приведения.Это достаточно веская причина?

Ответы [ 3 ]

26 голосов
/ 29 июля 2011

Это не относится к потоку памяти, скорее это связано с дизайном базового класса «Поток» и причиной этого является

Возвращаемое значение:

Байт без знака приведен к Int32 или -1, если в конце потока.

-1 не может быть представлен с помощью байта без знака

5 голосов
/ 29 июля 2011

Когда вы используете ReadByte Если чтение прошло успешно, текущая позиция в потоке увеличивается на один байт. но он предназначен для возврата -1, если достигнут конец потока.

Теперь это недопустимое значение для Byte (без знака)

ms.Read(buf,0,lenth); здесь длина - это число байтов для чтения из потока, а то, что вы получаете от ReadByte - это первый байт, который не будет использоваться таким образом, что-то вроде

byte[] buff = new byte[ms.Length];
ms.Read(buff , 0, buff .Length);
0 голосов
/ 29 июля 2011

Я верю, что они действительно преобразуются с int в byte по-настоящему хорошим способом, поскольку ReadByte() возвращает целое число, а их byteArray имеет тип int[].

...