C# 将原始字节数据转换为float[]和值需要介于-1和1之间

C# 将原始字节数据转换为float[]和值需要介于-1和1之间,c#,arrays,byte,bitconverter,C#,Arrays,Byte,Bitconverter,我不知道我是否做得对,但我使用此方法将字节数组转换为浮点数组,如下所示: 你可以看看: 请注意,它是如何将一个float乘以Int16.MaxValue将其转换为一个16位有符号整数的。这是因为内部数据格式是-Int16.MaxValue和+Int16.MaxValue之间的有符号16位整数 这意味着您正在使用的值是Int16(又称short),您需要通过将它们除以Int16.MaxValue,将它们转换回浮点数 例如,给定您的示例输入: byte[] bytes = { 232, 255, 2

我不知道我是否做得对,但我使用此方法将字节数组转换为浮点数组,如下所示:

你可以看看:

请注意,它是如何将一个
float
乘以
Int16.MaxValue
将其转换为一个16位有符号整数的。这是因为内部数据格式是-Int16.MaxValue和+Int16.MaxValue之间的有符号16位整数

这意味着您正在使用的值是
Int16
(又称
short
),您需要通过将它们除以
Int16.MaxValue
,将它们转换回浮点数

例如,给定您的示例输入:

byte[] bytes = { 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255 };

for (int i = 0; i < bytes.Length - 4; i += 4)
{
    float f = BitConverter.ToInt16(bytes, i) / (float)Int16.MaxValue; 
    Console.WriteLine(f);
}
byte[]bytes={232、255、235、255、232、255、235、255、232、255、235、255、232、255、235、255};
对于(int i=0;i
尝试删除
位转换器.IsLittleEndian
让我们看看会发生什么…我发现代码似乎是正确的(如果我们忽略可能的
IsLittleEndian
问题)。。。例如,您可以告诉我们序列的一些字节(大约16个字节就足够了)。。。你确定它们是4字节的浮点值,而不是8字节的双倍值吗?我在帖子中添加了一个示例
位转换器。IsLittleEndian
检查仅在字节数组是在big-endian机器上创建的情况下才有意义。如果字节是在同一台机器上创建的,那么反转它们是不正确的。我认为这是正确的答案,它对我有效,我画了一个光谱,值在-1和1之间,光谱很好。只需将float f=BitConverter.ToInt16(字节,i)/(float)Int16.MaxValue;带float f=BitConverter.ToInt16(字节,i/4)/(float)Int16.MaxValue;
byte[] {
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
...
}
    public void WriteSample(float sample)
    {
        if (WaveFormat.BitsPerSample == 16)
        {
            writer.Write((Int16)(Int16.MaxValue * sample));
            dataChunkSize += 2;
        }
        ...
byte[] bytes = { 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255 };

for (int i = 0; i < bytes.Length - 4; i += 4)
{
    float f = BitConverter.ToInt16(bytes, i) / (float)Int16.MaxValue; 
    Console.WriteLine(f);
}