Странное поведение с BinaryWriter и MemoryStream в C#

У меня есть класс со следующим методом:

public System.IO.Stream ToBinary ()
{
    int length = 4144;
    System.IO.Stream stream = null;
    System.IO.BinaryWriter writer = null;

    stream = new System.IO.MemoryStream(length);
    writer = new System.IO.BinaryWriter(stream);

    writer.Write(length);

    writer.Write(this._Width);
    writer.Write(this._Height);
    writer.Write(this._Stride);
    writer.Write(this._Bounds.X);
    writer.Write(this._Bounds.Y);
    writer.Write(this._Bounds.Width);
    writer.Write(this._Bounds.Height);

    writer.Write(this._A.Length);
    for (int i = 0; i < this._A.Length; i++) writer.Write(this._A [i]);
    writer.Write(this._R.Length);
    for (int i = 0; i < this._R.Length; i++) writer.Write(this._R [i]);
    writer.Write(this._G.Length);
    for (int i = 0; i < this._G.Length; i++) writer.Write(this._G [i]);
    writer.Write(this._B.Length);
    for (int i = 0; i < this._B.Length; i++) writer.Write(this._B [i]);

    writer.Flush();

    return (stream); // If I write the contents of stream to a byte array, each element is 0.
}

public static byte [] ToBytes (this System.IO.Stream stream)
{
    return (stream.ToBytes(0, (int) stream.Length));
}

public static byte [] ToBytes (this System.IO.Stream stream, int offset, int count)
{
    byte [] buffer = null;

    buffer = new byte [count];

    stream.Read(buffer, offset, count);

    return (buffer);
}

В приведенном выше коде я знаю, что по крайней мере одно из значений, записываемых в поток, не равно нулю. Результирующий поток при преобразовании в массив байтов содержит все нули.

Я неправильно использую объекты потока и чтения?


person Raheel Khan    schedule 10.07.2013    source источник
comment
Используете ли вы метод MemoryStream.ToArray для преобразования в массив? Вы вызываете это в блоке Try...Catch и выбрасываются ли какие-либо исключения?   -  person keyboardP    schedule 10.07.2013
comment
Нет попытки/поймать, и я использую методы расширения для преобразования в байтовые массивы. Включили метод в вопрос выше.   -  person Raheel Khan    schedule 10.07.2013


Ответы (1)


Ваш метод ToBytes считывает байты от текущей позиции потока до конца потока. Если поток уже расположен в конце, он считывает нулевые байты. Поток, возвращаемый вашим методом ToBinary, располагается в конце.

Взгляните на MemoryStream.ToArray Method:

Метод MemoryStream.ToArray

Записывает содержимое потока в массив байтов независимо от свойства Position.

person dtb    schedule 10.07.2013
comment
Спасибо. Позаботился о положении потока везде, кроме этого. Я использую базовый класс Stream, так как этот метод будет вызываться из нескольких мест с объектами MS, а также с объектами FileStream. - person Raheel Khan; 10.07.2013
comment
Обратите внимание, что stream.Read(buffer, offset, count); не обязательно считывает count много байтов. Он считывает до count байтов. Взгляните на stackoverflow.com/a/221941. - person dtb; 10.07.2013