c# int[] 数组到字节 [] 数组仅 LSB

本文关键字:数组 LSB 到字节 int | 更新日期: 2023-09-27 18:33:11

int[] 数组写入 byte[] 数组但只有 LSB(最后 8 位)的最快方法是什么?我使用了for循环和位掩码bArray[i] = (byte)(iArray[i] & 0xFF),但数组很长(+900k),这大约需要 50 毫秒。你知道其他更快的选择吗?

c# int[] 数组到字节 [] 数组仅 LSB

您可以尝试并行化工作负载:

Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF));

这将生成多个线程来进行转换。它在我的机器上往往更快,但由于生成多个线程的开销,有时需要更长的时间。

你在做什么,50毫秒太慢了?

缓慢的部分原因是需要读取比您需要的更多的数据:当您这样做时

array[i] & 0xFF

你读取了int的全部四个字节,却删除了三个最重要的字节。

您可以使用不安全的代码来避免此开销。请记住,下面的方法假设小端架构:

static unsafe void CopyLsbUnsafe(int[] from, byte[] to) {
    fixed (int* s = from) {
        fixed (byte* d = to) {
            byte* sb = (byte*) s;
            int* db = (int*)d;
            int* end = db + to.Length/4;
            while (db != end) {
                *db++ = (*(sb + 0) << 0)
                      | (*(sb + 4) << 8)
                      | (*(sb + 8) << 16)
                      | (*(sb + 12) << 24);
                sb += 16;
            }
        }
    }
}

上面的代码将int数组重新解释为字节数组,将字节数组重新解释为整数数组。然后,它使用指针将每 4 个字节读取到目标数组中,使用整数赋值以四个字节为一组写入目标。

我的测试显示,与一个简单的循环相比,有 60% 的改进。