2013-10-14 68 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)); 
相關問題