![](/img/trans.png)
[英]C# Change Control.Top From 16bit to 32bit Int (WinForms)
[英]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.