从float(IEEE754)转换为byte []

时间:2017-11-07 14:23:54

标签: c# arrays floating-point ieee-754 bitconverter

我使用IEEE754格式通过TCP传递某些值。在这个例子中,我将int转换为byte [],然后使用BitConverter将其转换为float(已经是IEEE754 Single格式,32位)。

我需要将这个浮点数存储到一个字节[4]中,但不要回到原始值(不会以指定的格式编码)。 BitConverter.GetBytes()自动执行此操作,这就是我无法使用它的原因。

int volumeInt = (int)(volumeTest);
byte[] volumeTank = new byte[4];

volumeTank[0] = (byte)(volumeInt >> 24);
volumeTank[1] = (byte)(volumeInt >> 16);
volumeTank[2] = (byte)(volumeInt >> 8);
volumeTank[3] = (byte)(volumeInt >> 0);

float volumeFloat = BitConverter.ToSingle(volumeTank, 0);

有什么想法吗?

修改

上下文: 我这样做的原因是将byte []编码为ASCII并将其包含在将通过TCP发送的字符串中。它必须是IEEE-754格式,并且必须以ASCII编码。虽然我正在寻找的答案只是如何将浮点数转换为byte []。

示例:

给定一个int:9876。它可以作为float转换为IEEE754格式:-8.380858E-27。现在,我想将此值存储在一个字节数组中,而不会丢失格式并返回其原始值(9876)。

1 个答案:

答案 0 :(得分:1)

修复格式,假设你有关于BigEndian的协议。同样在online hex converter中可以帮助查看十六进制字符串的不同表示形式:

using System;

public class Program
{
    public static void Main()
    {
        float f = 9876f;
        var bytes = GetBigEndian(f);
        Console.WriteLine("{0} => {1}", f, BitConverter.ToString(bytes));
        Console.WriteLine("{0} => {1}", f, GetFloatFromBigEndian(bytes));
    }

    static byte[] GetBigEndian(float v)
    {
        byte[] bytes = BitConverter.GetBytes(v);
        if (BitConverter.IsLittleEndian)
            Array.Reverse(bytes);
        return bytes;
    }

    static float GetFloatFromBigEndian(byte[] bytes)
    {
        if (BitConverter.IsLittleEndian)
            Array.Reverse(bytes); // We have to reverse
        return BitConverter.ToSingle(bytes, 0);
    }
}