簡體   English   中英

如何從32 / 24bit從字節到16bit到字節進行通用轉換

[英]How have a generic conversion from 32/24bit From Bytes To 16bit To bytes

已經搜索解決方案兩天了。 我想將wave的32位或24位轉換為16位。

閱讀了幾個stackoverflow主題后,這是我的代碼):

byte[] data = Convert.FromBase64String("-- Wav String encoded --") (32 or 24 bits)
int  conv =  Convert.ToInt16(data);
byte[] intBytes = BitConverter.GetBytes(conv);
if (BitConverter.IsLittleEndian)
   Array.Reverse(intBytes);
 byte[] result = intBytes;

但是當我writeAllbyte我的結果時,什么也聽不到...

這是一種削減最低有效位的方法:

byte[] data = ...
var skipBytes = 0;
byte[] data16bit;
int samples;
if( /* data was 32 bit */ ) {
    skipBytes = 2;
    samples = data.Length / 4;
} else if( /* data was 24 bit */ ) {
    skipBytes = 1;
    samples = data.Length / 3;
}
data16bit = new byte[samples * 2];
int writeIndex = 0;
int readIndex = 0;
for(var i = 0; i < samples; ++i) {
    readIndex += skipBytes; //skip the least significant bytes
    //read the two most significant bytes
    data16bit[writeIndex++] = data[readIndex++];
    data16bit[writeIndex++] = data[readIndex++];
}

假定字節順序為小字節(最低有效字節為第一個字節,通常用於WAV RIFF)。 如果您有大字節序,則必須在兩行讀取之后放置readIndex += ...

您可以為該任務實現自己的轉換迭代器,如下所示:

IEnumerable<byte> ConvertTo16Bit(byte[] data, int skipBytes)
{
    int bytesToRead = 0;
    int bytesToSkip = skipBytes;
    int readIndex = 0;
    while (readIndex < data.Length)
    {
        if (bytesToSkip > 0)
        {
            readIndex += bytesToSkip;
            bytesToSkip = 0;
            bytesToRead = 2;
            continue;
        }
        if (bytesToRead == 0)
        {
            bytesToSkip = skipBytes;
            continue;
        }
        yield return data[readIndex++];
        bytesToRead--;
    }
}

這樣,您就不需要創建新數組。 您可以使用IEnumerable<T>擴展方法將數據數組簡單地轉換為新的16位數組:

var data16bit = ConvertTo16Bit(data, 1).ToArray();

或者,如果不需要數組,可以跳過最低有效字節來迭代數據:

foreach (var b in ConvertTo16Bit(data, 1))
{
    Console.WriteLine(b);
}

暫無
暫無

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

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