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))?

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));