簡體   English   中英

將float轉換為字節然后將字節數組保存在內存中的最快方法?

[英]Fastest way to convert float to bytes and then save byte array in memory?

我目前正在編寫將音頻片段轉換為float數組然后想要將該float數組轉換為字節的代碼,最后將該字節數組轉換為十六進制。

一切正常但我們正在嘗試保存數據的數組,當這些數據被轉換為字節時,這些數據是數十萬個元素,一旦我們嘗試將這些數據保存為十六進制字符串,它對於移動設備來說有點多或者需要太長時間我們正在測試處理的設備。

所以我的問題是有沒有辦法優化/加快這個過程?

這是我的將float數組轉換為字節的代碼:

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("-","");
    }

最后,我們將字符串保存並將其從十六進制字符串轉換為浮點數組。

就像我說代碼很慢但它正在工作我只是想找到優化/加速這個過程以提高性能的最佳方法

你知道哪個部分花了你嗎? 我強烈懷疑轉換為十六進制數組不是程序中的瓶頸。

刪除連字符的最后一部分最終會復制字符串。 你可以通過編寫自己的方法來做得更好,這種方法可以復制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();
}

這將避免一個字符串副本。

如果你願意使用不安全的代碼(不知道你是否可以在你正在使用的設備上),你甚至可以通過甚至不復制到字節數組來加快速度。 相反,你修復了內存中的浮點數組,然后使用字節指針對它進行尋址。如果您對此感興趣,請參閱不安全代碼和指針

聽起來真的很復雜 - 音頻樣本通常不是整數嗎?

無論如何,StreamWriter本身支持單和雙寫,因此您可以使用它來構建一個然后轉換為十六進制的內存流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM