我刚刚对如何将4个有符号字节的数组转换为浮点数感到困惑。如何将有符号字节数组转换为浮点数?
我只知道无符号字节BTS的阵列,大概我可以用这个功能
BitConverter.ToSingle(bts, 0);
但是,它看起来像BitConverter.ToSingle只接受字节数组,而不是为sbyte阵列。
请问有人能给我一些想法吗?
谢谢!
我刚刚对如何将4个有符号字节的数组转换为浮点数感到困惑。如何将有符号字节数组转换为浮点数?
我只知道无符号字节BTS的阵列,大概我可以用这个功能
BitConverter.ToSingle(bts, 0);
但是,它看起来像BitConverter.ToSingle只接受字节数组,而不是为sbyte阵列。
请问有人能给我一些想法吗?
谢谢!
也许这:
float num = 0;
for (int i = 0; i < sbytesArr.Length; i++)
{
num = (num | sbytesArr[i]) << i * 4;
}
也许我没有清楚我的问题,我想要的结果是将数组中的4个字节转换为浮点数,而不是浮点数组。但是,感谢您的回答 – user3535716
如果不是'表达式'比'和'? –
Float value = 5000.1234;
//
// Invoke BitConverter.GetBytes to convert double to bytes.
//
byte[] array = BitConverter.GetBytes(value);
foreach (byte element in array)
{
Console.WriteLine(element);
}
//
// You can convert the bytes back to a double.
//
Float result = BitConverter.Tofloat(array, 0);
Console.WriteLine(result);
OP是要求其他方式 –
假设您的符号字节是在一个名为sbts
可以先全部转换为一个无符号字节数组的数组,然后使用BitConverter.ToSingle()
。
byte[] bts = new byte[sbts.Length];
Buffer.BlockCopy(sbts, 0, bts, 0, sbts.Length);
float f = BitConverter.ToSingle(bts, 0);
It is a little known fact that byte
and sbyte
are interchangeable at the CLR level:
sbyte[] a = new sbyte[1];
byte[] b = (byte[])(object)a;
此代码实际工作在运行时。所以可以传入你有的数组。
BitConverter.ToSingle((byte[])(object)bts, 0);
这里有一些关于这种技术的更多讨论:http://stackoverflow.com/questions/829983/how-to-convert-a-sbyte-to-byte-in-c我认为在那里做的关键评论是:*这是做什么改变数组的编译时间类型。有用的技术,但它取决于最终消耗结果。例如,'System.Array.Copy(Array,int,Array,int,int)'查看两个数组的运行时类型,如果您尝试将“真实”字节[]复制到'sbyte []'伪装成'byte []'。* –
因为它转换对象类型,它不会转换值。每个4个字节将成为单个浮点值。因为字节只是内存中的浮点表示的一部分,所以标志在这里没有任何意义。如果你必须转换值,那么你必须创建一个新的float数组并且在那里复制值(一个接一个)。 –
你的签名字节表示一个浮点数?正常情况下,4个无符号字节表示如下所示的一个浮点数。如果给出具体示例,我们可以给出一个解决方案 –
也就是说,如果我得到一个有符号数组和另一个无符号数组,但理论上它们可能成为相同的浮点数..... – user3535716