2013-10-14 34 views
-1

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

输出必须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# ??

+0

输出必须是44100.什么是输入? – Miller

+0

@MillerKoijam'新字节[4] {172,68,0,0}' – Servy

+3

你曾经期待得到非整数值,还是最后两个字节总是0?如果你想处理非整数值,你能举个例子吗? –

回答

1

.Net没有内置的32位定点数据类型,但可以很容易地将结果存储在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 

原来的存储格式之间进行转换,这是一个相当简单的。你可能简单地反转字节,虽然我不完全确定哪个十进制数字更重要。

+0

好的谢谢你,但是这个号码是65536.0? – user2839704

+0

@ user2839704这就是2¹ - 即。 '65536 == Math.Pow(2,16)' –

+0

好的,但为什么在分区使用65536 – user2839704

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)); 
相关问题