4

C# NETMFfloatプロジェクトがあり、aを a に、byte[]またはその逆に変換する必要があります。問題は、NETMF にはSystem.BitConverter.NET のようなものがないことです。そのため、低レベルに移行して自分で実行しない限り、それを行う方法を実際に見つけることができません。

私は常に高レベル ( JavaPythonC#など) をプログラミングしており、C++ に手を出しただけなので、フロートをバイト配列に変換する方法がよくわかりません。

これを行うためのボイラープレート関数のサンプル コードはどのようになりますか?

4

3 に答える 3

4

は.NET Micro FrameworkStructLayoutAttributeサポートされているため、C++ スタイルの共用体を使用して float のバイトを取得できます (その逆も可能です)。

[StructLayout(LayoutKind.Explicit)]  
public struct FloatUnion
{ 
    [FieldOffset(0)] public float Value;
    [FieldOffset(0)] public byte Byte0;
    [FieldOffset(1)] public byte Byte1;
    [FieldOffset(2)] public byte Byte2;
    [FieldOffset(3)] public byte Byte3;

    public byte[] ToByteArray()
    {
        return new[] { Byte0, Byte1, Byte2, Byte3 };
    }

    public static byte[] FloatToBytes(float value)
    {
        return new FloatUnion { Value = value }.ToByteArray();
    }

    public static float BytesToFloat(byte[] bytes)
    {
        if (bytes.Length != 4) throw new ArgumentException("You must provide four bytes.");
        return new FloatUnion { Byte0 = bytes[0], Byte1 = bytes[1], Byte2 = bytes[2], Byte3 = bytes[3] }.Value;
    }
}
于 2012-06-18T17:53:11.950 に答える
1

整数のバイト内の各ビットのステータスから各値が容易に決定される整数 (Int32、Byte、UInt64 など) とは異なり、浮動小数点数を 2 進数で直感的に表現することはできないため、IEEE は次の仕様を定義しました。浮動小数点数: IEEE-754 . 簡単ではありませんが、仕様の規則に従うことで、.NET の System.Single および System.Double インスタンスを一連のバイトにシリアル化できます。

デスクトップの .NET Framework は実際にここでごまかしています。GetBytes(Single) 関数は、実際には Single インスタンスを Int32 にキャストし、生のポインターを使用して生のバイトを 4 バイト配列にコピーします。ただし、マイクロ フレームワークはポインターをサポートしていないため、この便利なショートカットを使用することはできません。さらに悪いことに、MF には BinaryWriter も含まれていません。残念ながら、独自の IEEE-754 シリアライザを作成する必要があります。

于 2012-06-18T17:33:32.077 に答える
0

BinaryWriterの上に を使用しMemoryStreamます。

于 2012-06-18T17:27:35.677 に答える