Вопреки вашему первоначальному утверждению, BinaryWriter
- это точно , что вы хотите.Вот для чего он предназначен.В частности, это совершенно уместно, если вы собираетесь использовать BinaryReader
позже.
Вы не указали, почему вы не хотите его использовать, но это действительно то, что вы должны использовать:
using (MemoryStream stream = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(2);
writer.Write((short) 3);
writer.Write((short) 3);
writer.Write(4.4f);
writer.Write(5.6f);
}
byte[] bytes = stream.ToArray();
}
Создает байтовый массив со следующими данными:
[Int32 ] [Int16] [Int16] [Single ] [Single ]
02 00 00 00 03 00 03 00 CD CC 8C 40 33 33 B3 40
Обратите внимание: ваше описание записывает эти значения:
- Int32
- Int16
- Int16
- Single
- Single
... но ваш код чтения будет читать:
- Int32 (value 2)
- Int16
- Int16
- Int32 (this wasn't written - so you're reading data from the first Single!)
- ???
Другими словами, если ваши предыдущие попытки с BinaryWriter
не увенчались успехом, потому что они выглядели как мой исходный код,это потому, что вы забыли
writer.Write(2);
после записи значений Int16, чтобы сказать, сколько значений Single присутствовало.
Обратите внимание, что если вам не нужны значения в виде байтового массива,Вам не нужно звонить ToArray
- просто верните поток (без его утилизации).Тем не менее, вы захотите «перемотать» его перед прочтением.Например:
public Stream GetData()
{
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream); // Don't close at the end!
writer.Write(2);
writer.Write((short) 3);
writer.Write((short) 3);
writer.Write(2); // Extra count for the Single values
writer.Write(4.4f);
writer.Write(5.6f);
writer.Flush(); // May not be required...
stream.Position = 0; // Rewind so stream can be read again
return stream;
}