2014-05-03 148 views
2

我刚刚对如何将4个有符号字节的数组转换为浮点数感到困惑。如何将有符号字节数组转换为浮点数?

我只知道无符号字节BTS的阵列,大概我可以用这个功能

BitConverter.ToSingle(bts, 0); 

但是,它看起来像BitConverter.ToSingle只接受字节数组,而不是为sbyte阵列。

请问有人能给我一些想法吗?

谢谢!

+0

因为它转换对象类型,它不会转换值。每个4个字节将成为单个浮点值。因为字节只是内存中的浮点表示的一部分,所以标志在这里没有任何意义。如果你必须转换值,那么你必须创建一个新的float数组并且在那里复制值(一个接一个)。 –

+0

你的签名字节表示一个浮点数?正常情况下,4个无符号字节表示如下所示的一个浮点数。如果给出具体示例,我们可以给出一个解决方案 –

+0

也就是说,如果我得到一个有符号数组和另一个无符号数组,但理论上它们可能成为相同的浮点数..... – user3535716

回答

1

也许这:

float num = 0; 

for (int i = 0; i < sbytesArr.Length; i++) 
{ 
    num = (num | sbytesArr[i]) << i * 4; 
} 
+0

也许我没有清楚我的问题,我想要的结果是将数组中的4个字节转换为浮点数,而不是浮点数组。但是,感谢您的回答 – user3535716

+0

如果不是'表达式'比'和'? –

1
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); 
+0

OP是要求其他方式 –

1

假设您的符号字节是在一个名为sbts可以先全部转换为一个无符号字节数组的数组,然后使用BitConverter.ToSingle()

byte[] bts = new byte[sbts.Length]; 
Buffer.BlockCopy(sbts, 0, bts, 0, sbts.Length); 
float f = BitConverter.ToSingle(bts, 0); 
1

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); 
+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 []'。* –

相关问题