我有字节数组,我想找到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#??
答案 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));