32 位无符号定点数 (16.16)
本文关键字:定点数 无符号 | 更新日期: 2023-09-27 18:35:15
我有字节数组,我想找到 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 位定点数据类型,但您可以轻松地将结果存储在双精度中。
这并不像您可能正在寻找的那样高效或优雅,但您可以执行以下操作将字节数组转换为双精度数组:
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));