我有字节数组,我想找到 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
如何使用 c# 将其转换为(32 位无符号定点数 (16.16))?
我有字节数组,我想找到 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
如何使用 c# 将其转换为(32 位无符号定点数 (16.16))?
.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
您的原始存储格式与此格式之间的转换相当简单。您可能可以简单地反转字节,尽管我不完全确定哪个十进制数字更重要。
取决于您如何回答上面的@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));