我需要序列化一堆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;
}
答案 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
关键字并转换指针,但这需要不安全的代码。