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

标签 c# arrays byte bitconverter

如果我做对了,我不会这样做,但我正在使用此方法将字节数组转换为 float 组,如本 link 所示。 :

public static float[] ConvertByteToFloat(byte[] array) {   
        float[] floatArr = new float[array.Length / 4];   
        for (int i = 0; i < floatArr.Length; i++) {
              if (BitConverter.IsLittleEndian) {
                 Array.Reverse(array, i * 4, 4);
              }
              floatArr[i] = BitConverter.ToSingle(array, i * 4);   
        }   
        return floatArr; 
}

输入数组是一个包含波形原始数据的数组(没有标题)

问题是我得到(转换后)像这样的值:

-9.66012E+24, 1963.15576, -5.11384777E-36, -1.19718621E-07

如何将此数组转换为 float 组且其值应介于 -1.0 和 1.0 之间?

编辑:

我的输入数组是这样开始的:

byte[] {
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
    232,
    255,
    235,
    255,
...
}

最佳答案

可以看看the implementation of WriteSample() :

    public void WriteSample(float sample)
    {
        if (WaveFormat.BitsPerSample == 16)
        {
            writer.Write((Int16)(Int16.MaxValue * sample));
            dataChunkSize += 2;
        }
        ...

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

这意味着您正在使用的值是 Int16(又名 short),您需要将它们除以 将它们转换回 float 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);
}

关于c# - 将原始字节数据转换为 float[] 并且值需要介于 -1 和 1 之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44111155/

相关文章:

javascript - 我有两个包含其他数组的数组。如何将 array1 中的每个嵌套数组与 array2 中的对应数组进行比较?

c - 如何使用缩减并行化这个 for 循环?

c++ - 作为函数参数的 THREADENTRY32 结构数组导致 C2061

iphone - 用 unichar 追加字符串

c# 处理来自 mysql 查询的空字节数组

c++ - C++ 中字符串/整数的字节

c# - 如何使用 C# 过滤具有多列值的数据表

c# - PKCS#11 在本地主机上工作,但它不在实时 Web 服务器(客户端计算机)上工作

c#:将 Get/Set 从 vb.net 转换为 c#

c# - 使用 ASP.NET Core 在 Fluent API 中创建由外键组成的复合主键