我有字節的數組,我想找到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# ??
我有字節的數組,我想找到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# ??
.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
原來的存儲格式之間進行轉換,這是一個相當簡單的。你可能簡單地反轉字節,雖然我不完全確定哪個十進制數字更重要。
好的謝謝你,但是這個號碼是65536.0? – user2839704
@ user2839704這就是2¹ - 即。 '65536 == Math.Pow(2,16)' –
好的,但爲什麼在分區使用65536 – user2839704
取決於你如何回答@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));
輸出必須是44100.什麼是輸入? – Miller
@MillerKoijam'新字節[4] {172,68,0,0}' – Servy
你曾經期待得到非整數值,還是最後兩個字節總是0?如果你想處理非整數值,你能舉個例子嗎? –