从 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);
}
}
我使用 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);
}
}