Двоичный модуль записи возвращает байтовый массив с нулем - PullRequest
2 голосов
/ 23 сентября 2011

Я работаю с протоколом MRIM (Агент Mail.Ru). MRIM - это двоичный протокол, поэтому, чтобы сделать данные двоичными, я использую класс BinaryWriter. Вот код:

    private byte[] CreateMrimPacket(ulong message) 
    { 
       byte[] binaryData; 
        using (MemoryStream ms = new MemoryStream()) 
        { 
            using (BinaryWriter bw = new BinaryWriter(ms)) 
            { 
                bw.Write(CS_MAGIC); //CS_MAGIC is a constant that doesn't equal 0
                bw.Write(PROTO_VERSION); //Same thing
                bw.Write((ulong)SeqCounter); 
                bw.Write(message); 
                bw.Write((ulong)0); 
                bw.Write((ulong)0); 
                bw.Write((ulong)0); 
                bw.Write((ulong)0); 
                bw.Write((ulong)0); 
                bw.Write((ulong)0); 
                bw.Write((ulong)0); 
                binaryData = new byte[ms.Length]; 
                ms.Read(binaryData, 0, binaryData.Length); 
            } 
        } 
        return binaryData; 
    } 

Эта функция возвращает байтовый массив, но все значения равны 0.
Пожалуйста, помогите мне решить эту проблему.
Заранее спасибо

1 Ответ

9 голосов
/ 23 сентября 2011

Вы пишете в поток, оставляя его в конце записанных вами данных , а затем читаете из него.В текущей позиции данных нет!

Вы могли бы использовать ms.Position = 0; перед чтением ... но, к счастью, это проще, чем вы делаете это в любом случае ... просто используйте:

return ms.ToArray();

MemoryStream.ToArray возвращает все данные в потоке, независимо от текущей позиции (а также независимо от того, закрыт поток или нет).

...