我使用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)。
答案 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);
}
}