将float作为字节存储到大数组而不是new byte []

时间:2012-12-13 22:28:22

标签: c# file serialization

我需要序列化一堆float并在必要时转换为小端。我知道BitConverter.GetBytes(float),但我宁愿避免在GC堆上分配大量的4字节小数组。如何将转换为具有偏移索引的现有大byte[]数组?我想要这样的东西:

float[] theFloats; // filled up somewhere
byte[] theBytes = new byte[theFloats.Length * 4];

int offset = 0;
for (int i = 0; i < numFloats; ++i)
{
    MagicClass.CopyFloatToBytes(theFloats[i], theBytes, offset);
    offset += 4;
}

2 个答案:

答案 0 :(得分:1)

您可以在数组周围创建MemoryStream,然后创建一个BinaryWriter并为其写入浮点数。

答案 1 :(得分:1)

为什么不使用BitConverter.GetBytes

您也可以使用[StructLayout(LayoutKind.Explicit)]

执行此操作
[StructLayout(LayoutKind.Explicit)]
public struct Convert32BitType
{
    [FieldOffset(0)]
    public int Int32Value;
    [FieldOffset(0)]
    public float FloatValue;
}

// Example:
var tmp = new Convert32BitType();
tmp.FloatValue = 1.1;
int ival = tmp.Int32Value;
byte b1 = (byte)(ival >> 24);
byte b2 = (byte)(ival >> 16);
byte b3 = (byte)(ival >> 8);
byte b4 = (byte)(ival >> 0);

另一种可能性是使用fixed关键字并转换指针,但这需要不安全的代码。