MemoryStream来自bytes数组,具有不同类型的数据

我想创建一个包含int32,int16,单值的内存流。 使用二进制文件是没用的,所以我试图创建字节数组。 因为值是不同的类型,我不知道如何正确地做到这一点。 所以我尝试这样做:

byte[] tab = new byte[]{2,0,0,0,3,0,3,0} – 2是int32(四个字节),另外两个3是int16(两个字节)

这工作正常,但是当我想添加一些单个值时,它会产生错误。 我不能这样做:

byte[] tab = new byte[]{2,0,0,0,3,0,3,0,4.4f,5.6f}

我必须有正确格式的流,因为这个流将在这个方法中读取:

 short[] rawData; float[] modulusData; public void rawData(Stream s) { BinaryReader br = new BinaryReader(s); int dataCount = br.ReadInt32(); if (dataCount > 0) { rawData = new short[dataCount]; for (int i = 0; i  0) { modulusData = new float[dataCount]; for (int i = 0; i < dataCount; i++) modulusData[i] = br.ReadSingle(); } else modulusData = new float[0]; } 

谁知道怎么做?

与您原来的陈述相反, 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值之后,说出存在多少单个值。

请注意,如果您不需要将值作为字节数组,则无需调用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; } 

BinaryWriter根本没用。 只需创建一个内存流并写入它:

 MemoryStream m = new MemoryStream(); using (BinaryWriter writer = new BinaryWriter(m)) { writer.Write(2); // count writer.Write((short)3); writer.Write((short)3); writer.Write(2); // count writer.Write(4.4f); writer.Write(5.6f); } byte[] tab = m.ToArray(); 

请注意,我还为浮点值添加了一个计数。 它不在您的示例数据中,但读取数据的方法需要它。

我validation了数据可以正确读取。 我使用了你的读者代码,并写出了结果:

 Console.WriteLine(rawData.Length); foreach (short x in rawData) Console.WriteLine(x); Console.WriteLine(modulusData.Length); foreach (float f in modulusData) Console.WriteLine(f); 

输出:

 2 3 3 2 4,4 5,6 

构造像这样的字节数组不起作用,因为Int32Int16将被隐式转换为byte ,这对于浮点数不会发生,因此编译器会出错。

最好的方法是使用BinaryWriter以相同的方式写入流: BinaryWriter (参见其他答案)