0

(42 E6 56 00)この浮動小数点数に変換する必要がある 16 進数があります:115.2もちろん、浮動小数点数です32(115.2電卓を使用しています)。C# を使用してこの操作を実行したいのですが、次のコードを使用しますが、奇妙な値が返されます。

byte[] bytes = BitConverter.GetBytes(0x42E65600);
if (BitConverter.IsLittleEndian) {
    bytes = bytes.Reverse().ToArray();
}
float myFloat = BitConverter.ToSingle(bytes, 0);
4

2 に答える 2

2

より良い書き方:

byte[] bytes = new byte[]{ 0x42, 0xE6, 0x56, 0x00 }; // Big endian data
if (BitConverter.IsLittleEndian) {
    Array.Reverse(bytes); // Convert big endian to little endian
}
float myFloat = BitConverter.ToSingle(bytes, 0);

BitConverterプラットフォームのエンディアンを使用することに注意してください。

IEEE-754 Analysisでテストしましたが、ソース データは本当にビッグ エンディアンであるように見えるので、これが正しい書き方です。

知らないかもしれませんが、リトル エンディアン プラットフォームBitConverter.GetBytes(0x42E65600);に乗るでしょう。byte[]{ 0x00, 0x56, 0xE6, 0x42 }


16 進数リテラルの記述を主張する場合は、エンディアンを変換する必要はありません (常に正しいため、@George のコメントを参照してください)。

byte[] bytes = BitConverter.GetBytes(0x42E65600);
float myFloat = BitConverter.ToSingle(bytes, 0); // Always be correct
于 2013-03-10T06:09:40.760 に答える
1

この浮動小数点数に変換する必要がある 16 進数 (42 E6 56 00) があります: 115.2

その場合、データはビッグエンディアン形式です

BitConverter.IsLittleEndian  

これにより、ビット変換されたビット数が決定されるため、条件を次のようにする必要があります

if (!BitConverter.IsLittleEndian)

最後に、エンディアン変換が間違っています。配列全体を逆にするのではなく、個々の float エントリを交換する必要があります

        for (int i = 0; i < data.Length / 2; i++)
        {
            Swap<byte>(ref data[i], ref data[data.Length - i - 1]);
        }

これらすべての修正を組み合わせると、コードは次のようになります

   static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp;
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
    static byte[] Big2Little(byte[] data)
    {
        for (int i = 0; i < data.Length / 2; i++)
        {
            Swap<byte>(ref data[i], ref data[data.Length - i - 1]);
        }
        return data;

    }
    static void Main(string[] args)
    {
        byte[] bytes = BitConverter.GetBytes(0x42E65600);
        if (!BitConverter.IsLittleEndian)
        {
            bytes = Big2Little(bytes);
        }
        float myFloat = BitConverter.ToSingle(bytes, 0);
        System.Console.Out.WriteLine(myFloat);
    }

注意IEEE アナライザから結果を確認できます。

于 2013-03-10T06:35:33.937 に答える