从 float (IEEE754) 转换为 byte[]

Converting from float (IEEE754) to byte[]

我使用 IEEE754 格式通过 TCP 传递一些值。在此示例中,我将一个 int 转换为一个 byte[],然后使用 BitConverter 将其转换为一个浮点数(已经是 IEEE754 单一格式,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 编码。虽然我正在寻找的答案只是如何将 float 转换为 byte[].

示例:

给定一个整数:9876。它可以转换为 IEEE754 格式的浮点数:-8.380858E-27。现在,我希望这个值存储在一个字节数组中,而不会丢失格式并返回到其原始值 (9876)。

修正格式,假设您有关于 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);
    }
}