32位无符号定点数(16.16)

时间:2013-10-14 20:12:15

标签: c#

我有字节数组,我想找到32位无符号定点数(16.16))使用c#和

输出必须为44100

字节数组:

byte[] m = new byte[4] {172,68,0,0}
Console.WriteLine(" sample rate {0}", BitConverter.ToInt32(m, 0));

输出为17580.这是错误的:它应该是44100

如何将其转换为(32位无符号定点数(16.16))使用c#??

2 个答案:

答案 0 :(得分:1)

.Net没有内置的32位定点数据类型,但您可以很容易地将结果存储在double中。

这不像你可能想要的那样高效或优雅,但是你可以做这样的事情来将你的字节数组转换为double:

byte[] m = new byte[4] { 172, 68, 0, 0 };
double[] magnitude = new[] { 256.0, 1.0, 1.0/256.0, 1.0/65536.0 };
double i = m.Zip(magnitude, (x, y) => x * y).Sum(); // 44100.0

或者,如果您更改存储位的方式如下:

byte[] m = new byte[4] { 0, 0, 68, 172 };
double i = BitConverter.ToUInt32(m, 0) / 65536.0;   // 44100.0

原始存储格式与此存储格式之间的转换非常简单。你可能只是简单地反转字节,虽然我不完全确定哪个十进制数字更重要。

答案 1 :(得分:0)

根据您回答的方式@JonSkeet,上述评论将取决于此的小数值。但是,此解决方案适用于整数部分

        byte[] m = new byte[4] { 172, 68, 0, 0 };
        byte[] fraction = m.Reverse().Take(2).ToArray();
        byte[] integer = m.Reverse().Skip(2).Take(2).ToArray();

        System.Diagnostics.Debug.Print("{0}", BitConverter.ToUInt16(integer, 0));