[英]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.