0

一連の をシリアル化し、必要に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;
}
4

2 に答える 2

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);

もう 1 つの可能性は、fixedキーワードを使用してポインターをキャストすることですが、これには安全でないコードが必要です。

于 2012-12-13T23:52:39.407 に答える
1

MemoryStream配列の周りに を作成してから、 を作成しBinaryWriterて浮動小数点数を書き込むことができます。

于 2012-12-13T22:29:45.613 に答える