如何快速操作byte []中的数据?

时间:2010-08-13 15:22:57

标签: c# arrays memory

我需要删除byte[]中的每个第四个字节。 是否有一些内置函数可以帮助我做到这一点,还是我必须循环遍历数组拾取并逐个移动每个字节?

同样地,如果我需要在byte[]的每三个字节之后放置0,那么有什么方法可以比手动更快地完成此操作?

4 个答案:

答案 0 :(得分:3)

手动编码可能非常快,而且瓶颈是CPU到内存的带宽。

一个核心可以轻松地在现代机器上最大化内存带宽,因此多线程不太可能有所帮助,因为完成的工作非常简单(每4个元素一次读取或写入。)

答案 1 :(得分:1)

对于parallel For loop来说听起来不错(假设您可以使用.NET 4)。

答案 2 :(得分:1)

如果您不介意创建新阵列而不是修改现有阵列,可以使用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个问题是否与同一个数组相关?即你想删除每四个字节,然后每3个字节插入0,所有都在同一个数组?在这种情况下,你真正想做的是用0替换每个第四个字节,最有效的方法是使用for循环:

for(int i = 3; i < bytes.Length; i += 4)
{
    bytes[i] = 0;
}

答案 3 :(得分:0)

最快的方法可能是创建一个包装器来翻译索引而不是创建一个新数组。