C# 将浮点转换为字节,然后将字节数组保存在内存中的最快方法?

C# 将浮点转换为字节,然后将字节数组保存在内存中的最快方法?,c#,arrays,hex,byte,primitive-types,C#,Arrays,Hex,Byte,Primitive Types,我目前正在编写代码,将音频剪辑转换为浮点数组,然后将浮点数组转换为字节,最后将字节数组转换为十六进制 一切正常,但当数据转换为字节时,我们试图保存数十万个元素长的数据数组,一旦我们试图将数据保存为十六进制字符串,我们正在测试的移动设备处理起来可能会有点太多或太长 所以我的问题是,有没有办法优化/加速这个过程 下面是我将浮点数组转换为字节的代码: public byte[] ConvertFloatsToBytes(float[] audioData){ byte[] bytes =

我目前正在编写代码,将音频剪辑转换为浮点数组,然后将浮点数组转换为字节,最后将字节数组转换为十六进制

一切正常,但当数据转换为字节时,我们试图保存数十万个元素长的数据数组,一旦我们试图将数据保存为十六进制字符串,我们正在测试的移动设备处理起来可能会有点太多或太长

所以我的问题是,有没有办法优化/加速这个过程

下面是我将浮点数组转换为字节的代码:

public byte[]  ConvertFloatsToBytes(float[] audioData){

    byte[] bytes = new byte[audioData.Length * 4];

        //*** This function converts our current float array elements  to the same exact place in byte data 
        Buffer.BlockCopy(audioData,0,bytes,0,bytes.Length);



    return bytes;
}
public static string ByteArrayToString(byte[] ba)
    {
        string hex = BitConverter.ToString(ba);

        //Debug.Log("ba.length = " + ba.Length.ToString() +"hex string = " + hex);
        return hex.Replace("-","");
    }
这里我们将该数据转换为十六进制字符串:

public byte[]  ConvertFloatsToBytes(float[] audioData){

    byte[] bytes = new byte[audioData.Length * 4];

        //*** This function converts our current float array elements  to the same exact place in byte data 
        Buffer.BlockCopy(audioData,0,bytes,0,bytes.Length);



    return bytes;
}
public static string ByteArrayToString(byte[] ba)
    {
        string hex = BitConverter.ToString(ba);

        //Debug.Log("ba.length = " + ba.Length.ToString() +"hex string = " + hex);
        return hex.Replace("-","");
    }
最后,我们保存字符串并将其从十六进制字符串转换为浮点数组


就像我说的,代码很慢,但它正在工作,我只是想找到优化/加速这个过程的最佳方法,以提高性能,这听起来真的很复杂-音频样本通常不是整数吗


无论如何,StreamWriter支持以本机方式写入single和double,因此您可以使用它来构建一个内存流,然后将其转换为十六进制。

您知道哪一部分需要花费您的成本吗?我强烈怀疑到十六进制数组的转换不是程序中的瓶颈

最后一部分,删除连字符后,将复制字符串。您可以编写自己的方法来复制
BitArray.ToString
的功能,而不使用连字符,这样做可能会更好。即:

const string chars = "0123456789ABCDEF";

public string ByteArrayToString(byte[] ba)
{
    var sb = new StringBuilder(ba.Length*2);
    for (int i = 0; i < ba.Length; ++i)
    {
        var b = ba[i];
        sb.Append(chars[b >> 4]);
        sb.Append(chars[b & 0x0F]);
    }
    return sb.ToString();
}
const string chars=“0123456789ABCDEF”;
公共字符串ByteArrayToString(字节[]ba)
{
var sb=新的StringBuilder(ba.长度*2);
对于(int i=0;i>4]);
sb.追加(字符[b&0x0F]);
}
使某人返回字符串();
}
这将避免一个字符串副本


如果您愿意使用不安全的代码(不知道您是否可以在正在使用的设备上使用),您甚至可以通过不复制到字节数组来进一步提高速度。相反,您需要在内存中修复浮点数组,然后用字节指针对其进行寻址,看看您是否对此感兴趣。

是否有任何特殊原因需要将所有数据保留在内存中?你能用流来代替吗?它基本上是保存一个音频剪辑,这样每当播放器播放录音时,我们就可以用数据重新创建一个音频剪辑。实际上,我还没有使用过emory streams,但如果我需要随时访问内存流中的数据,它们会有优势吗?我认为
MemoryStream
使用数组作为其备份存储,因此据我所知,它不会提供性能优势。但是,流模式(参见System.IO.Stream)通常允许您避免将整个内容保存在内存中。我正在使用unity制作一个项目,它们提供的获取音频片段数据的本机函数返回一个浮点数组,因此我假设这是唯一的方法,或者我发现的所有方法您可能是正确的,但是,当我注释掉代码中的音频保存部分后,一切似乎都运行得更快了。我认为,由于数据量(音频文件通常在1到3 MB之间),转换这么多数据会导致问题,但也许我应该进一步调查。还感谢您提供有关将字节数据转换为的提示hex@user3242608:您如何保存数据?也就是说,在进行转换后是否将其写入文件?最后,我们使用一个内置结构保存数据,该结构保存持久数据。我们将此字符串保存在内存中。然后在加载数据并将十六进制字符串转换回浮点数组时获取它。@user3242608:那么为什么要将其转换为十六进制?不能直接保存浮点数组吗?或者将其转换为
字节[]
并调用。我相信这是因为最终我们希望能够通过网络发送此数据,并在另一端检索它。但您可能是对的,如果我只是将字节数组写入内存,那么我不应该有无法检索它的原因,我将在下一步考虑这样做。