Как быстро манипулировать данными в byte []? - PullRequest
4 голосов
/ 13 августа 2010

Мне нужно удалить каждый четвертый байт в byte[], который у меня есть.Есть ли какая-то встроенная функция, которая могла бы помочь мне сделать это, или мне нужно циклически выбирать массив и перемещать каждый байт один за другим?

Точно так же, что если мне нужно поместить 0 после каждых трехбайт из byte[] есть ли способ сделать это быстрее, чем вручную?

Ответы [ 4 ]

3 голосов
/ 13 августа 2010

Кодирование вручную может быть очень быстрым, и узким местом является пропускная способность процессора к памяти.

Одно ядро ​​может легко максимально увеличить пропускную способность памяти на современном компьютере, поэтому многопоточность маловероятначтобы помочь, так как проделанная работа очень проста (одно чтение или запись на 4-й элемент.)

1 голос
/ 13 августа 2010

Если вы не возражаете против создания нового массива вместо изменения существующего, вы можете легко сделать это с помощью Linq:

bytes = bytes.Where((b, i) => (i + 1) % 4 != 0).ToArray();

Для вставки элемента каждые 3 байта, нет способасделать это с помощью встроенных методов расширения.Но вы можете создать свой собственный метод расширения:

public static IEnumerable<T> InsertEvery<T>(this IEnumerable<T> source, T valueToInsert, int frequency)
{
    int n = 0;
    foreach (var item in source)
    {
        if ((n + 1) % frequency == 0)
            yield return valueToInsert;
        yield return item;
        n++;
    }
}

...

bytes = bytes.InsertEvery(0, 3).ToArray();

Кстати, ваши 2 вопроса относятся к одному и тому же массиву?т.е. вы хотите удалить каждый четвертый байт, а затем вставить 0 каждые 3 байта, все в одном массиве?В этом случае вы действительно хотите заменить каждый четвертый байт на 0, и самый эффективный способ сделать это - использовать цикл for:

for(int i = 3; i < bytes.Length; i += 4)
{
    bytes[i] = 0;
}
1 голос
/ 13 августа 2010

Звучит как хорошая работа для параллельной цикла For (при условии, что вы можете использовать .NET 4).

0 голосов
/ 13 августа 2010

Возможно, самым быстрым способом будет создание оболочки для перевода индексов вместо создания нового массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...