C# 32位无符号定点数字(16.16)

C# 32位无符号定点数字(16.16),c#,C#,我有一个字节数组,我想用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#?.Net没有内置的32位定点数据类型,但您可以非常轻松地将结果存储在双精度格式中 这并不像您可能想要的那样高效或优雅

我有一个字节数组,我想用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#?

.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

原始存储格式与此存储格式之间的转换相当简单。您可以简单地反转字节,尽管我不能完全确定哪个十进制数字更重要。

取决于您如何回答上面的注释,这将取决于它的分数值。但是,此解决方案适用于整数部分

        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。输入是什么?您是否希望得到非整数值,或者最后两个字节总是为0?如果你想处理非整数值,你能举个例子吗?你的输入看起来是大端顺序的(当然,如果你有一个16.16的定点数字,你不能这样打印它)44100=0xAC44。172=0xAC,68=0x44。使用BitConverter.ToInt32(m,0)而不是BitConverter.ToInt32(m,0)的原因是什么?@user2839704这是2⁶—i、 e.
65536==Math.Pow(2,16)
为什么要存储在一个双精度存储中?这肯定是对两个ushort成员的严格要求吗?@userp.s.w.g为什么在中使用65536division@DavidHeffernan当然可以,但OP并没有询问如何编写自定义数字类型。目前的问题是,关于具体的要求是什么,还很不清楚。有关如何执行此操作的示例,请参阅。@user2839704,因为他正在转换为Uint32,然后必须确保它是UInt16
0xFFFFFF/0x0001000=0xFFFF
0xFFFF=65535添加1,然后得到0x10000或65536