У меня есть массив, содержащий миллионы байтов.Эти байты являются значениями типа int (Int16, Int24 или Int32).Теперь я хочу получить x-байты со значением max int из количества байтов.
Итак, чтобы объяснить это лучше, давайте представим массив с 10 записями:
byte[] arr = {255, 10, 55, 60, 128, 90, 88, 66, 199, 56};
Я буду знать, будем ли мы использовать In16, Int24 или Int32, поэтому для этого примера давайте представим, что мы используем Int16.Это означает, что мы используем 2 байта для представления Int16.Таким образом, Ints состоят из:
{255, 10},
{55, 60},
{128, 90},
{88, 66},
{199, 56}
Проблема 1: Поскольку это необходимо для обработки звука, 1046 ниже, чем -2096.Таким образом, существует необходимость сравнения независимо от негатива
Проблема 2: Поскольку это должно быть очень производительным, преобразование байтов в Ints для сравнения кажется неэффективным, и должен быть другой способ.
Этоэто начальная точка:
/// <summary>
/// Gets the maximum value of a number of bytes representing Int-Values
/// </summary>
/// <returns>The channels.</returns>
/// <param name="leftChannel">Left channel.</param>
/// <param name="rightChannel">Right channel.</param>
/// <param name="bytesPerInt">Bytes per int. 2 bytes = Int16, 3 bytes = Int24, 4 bytes = Int32</param>
/// <param name="countBytesToCombine">The number of bytes to look for the highest value</param>
private (byte[] combinedLeft, byte[] combinedRight) CombineChannels(byte[] leftChannel, byte[] rightChannel, int bytesPerInt, int countBytesToCombine)
{
}
/// <summary>
/// Gets the highest byte[] value
/// </summary>
/// <returns>The highest value. The size of the byte array is equal the bytesPerInt</returns>
/// <param name="bytes">A subarray of the given byte array of the upper method. The size of this array is equals countBytesToCombine</param>
/// <param name="bytesPerInt">The count of bytes representing an Int</param>
private byte[] GetHighestValue(byte[] bytes, int bytesPerInt)
{
}
Edit2
Это рабочее решение, но его выполнение занимает около 2 секунд с 14 миллионами байтов для каждого канала, что слишком далеко.
/// <summary>
/// Gets the maximum value of a number of bytes representing Int-Values
/// </summary>
/// <returns>The channels.</returns>
/// <param name="leftChannel">Left channel.</param>
/// <param name="rightChannel">Right channel.</param>
/// <param name="bytesPerInt">Bytes per int. 2 bytes = Int16, 3 bytes = Int24, 4 bytes = Int32</param>
/// <param name="countValuesToCombine">The number of bytes to look for the highest value</param>
private (byte[] combinedLeft, byte[] combinedRight) CombineChannels(byte[] leftChannel, byte[] rightChannel, int bytesPerInt, int countValuesToCombine)
{
var cLeft = new List<byte>();
var cRight = new List<byte>();
for (int i = 0; i < leftChannel.Length; i += countValuesToCombine * bytesPerInt)
{
var arrLeft = SubArray(leftChannel, i, countValuesToCombine * bytesPerInt);
var arrRight = SubArray(rightChannel, i, countValuesToCombine * bytesPerInt);
cLeft.AddRange(GetHighestValue(arrLeft, bytesPerInt));
cRight.AddRange(GetHighestValue(arrRight, bytesPerInt));
}
return (cLeft.ToArray(), cRight.ToArray());
}
/// <summary>
/// Gets the highest byte[] value
/// </summary>
/// <returns>The highest value.</returns>
/// <param name="bytes">Bytes.</param>
/// <param name="bytesPerInt">The count of bytes representing an Int</param>
private byte[] GetHighestValue(byte[] bytes, int bytesPerInt)
{
byte[] bytesOfHighestValue = new byte[bytesPerInt];
for (int i = 0; i < bytes.Length; i += bytesPerInt)
{
var arr = SubArray(bytes, i, bytesPerInt);
if (IsValueHigher(arr, bytesOfHighestValue, bytesPerInt))
{
bytesOfHighestValue = arr;
}
}
return bytesOfHighestValue;
}
private bool IsValueHigher(byte[] one, byte[] two, int bytesPerInt)
{
var o = ConvertToInt(one, bytesPerInt);
var t = ConvertToInt(two, bytesPerInt);
return Math.Abs(o) > Math.Abs(t);
}
private int ConvertToInt(byte[] bytes, int bytesPerInt)
{
switch (bytesPerInt)
{
case 2:
return BitConverter.ToInt16(bytes, 0);
case 3:
return Int24.ToInt32(bytes, 0);
case 4:
return BitConverter.ToInt32(bytes, 0);
}
return 0;
}
Это чрезвычайно сложно объяснить, поэтому, пожалуйста, спросите, есть ли вопросы, прежде чем голосовать.