在C#中将十六进制转换为IEEE 754浮点

时间:2017-07-16 08:50:37

标签: c# hex ieee-754

我需要将8字节长的十六进制数转换为C#中的浮点数。 例如:

4030000000000000应为16.0

C0622EB860000000应为-14.46

4090000000000000应为1024.0

我发现这段代码似乎有效,但它没有说明这一点 适用于大于10且小于-10的数字。举个例子, -14.46显示为-1.4546。代码有什么问题?

const string formatter = "{0,20}{1,27:E16}";

// Reinterpret the long argument as a double.
public static void LongBitsToDouble( long argument )
{
    double doubleValue;
    doubleValue = BitConverter.Int64BitsToDouble( argument );

    // Display the argument in hexadecimal.
    Console.WriteLine( formatter, String.Format( "0x{0:X16}", argument ), 
     doubleValue );
}

public static void Main( )
{
    Console.WriteLine("This example of the BitConverter.Int64BitsToDouble( " 
    +"long ) \nmethod generates the following output.\n" );

    Console.WriteLine( formatter, "long argument","double value" );
    Console.WriteLine( "-------------" );

    // Convert long values and display the results.

    LongBitsToDouble( unchecked( (long)0x4030000000000000 )); //16.0
    LongBitsToDouble( unchecked( (long)0xC0622EB860000000 )); //-14.46


    Console.ReadKey();
}

1 个答案:

答案 0 :(得分:0)

尝试以下,第二个数字小数位错误。我颠倒了字节。 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<List<byte>> inputs = new List<List<byte>>() {
                 new List<byte>() {0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
                 new List<byte>() {0xC0, 0x62, 0x2E, 0xB8, 0x60, 0x00, 0x00, 0x00},
                 new List<byte>() {0x40, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        };
            foreach (List<byte> input in inputs)
            {
                input.Reverse();
                Console.WriteLine(BitConverter.ToDouble(input.ToArray(),0));
            }
            Console.ReadLine();
        }
    }
}