Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数组中检索常量字节数_C#_Arrays - Fatal编程技术网

C# 从数组中检索常量字节数

C# 从数组中检索常量字节数,c#,arrays,C#,Arrays,我有一个巨大的字节[]数据数组。我想获取特定数量的字节(考虑为Blocksize),并对其执行一些操作,并将每个块的所有结果一个接一个地添加到新数组中 这是我的代码: int j = 0; int number_of_blocks = (data.Length) / 16; byte[] one_block = new byte[16]; byte[] one_block_return = new byte[16];

我有一个巨大的
字节[]数据
数组。我想获取特定数量的字节(考虑为
Blocksize
),并对其执行一些操作,并将每个块的所有结果一个接一个地添加到新数组中

这是我的代码:

        int j = 0;
        int number_of_blocks = (data.Length) / 16;
        byte[] one_block = new byte[16];
        byte[] one_block_return = new byte[16];
        byte[] all_block_return = new byte[data.Length];

        for (int i = 0; i < number_of_blocks; i++)
        {
            Array.Copy(data, j, one_block, 0, 16);
            one_block_return = one_block_operation(one_block);
            Array.Copy(one_block_return, 0, all_block_return, j, 16);
            Array.Clear(one_block, 0, one_block.Length);
            j = j + 16;
        }
intj=0;
整数块的个数=(data.Length)/16;
字节[]一个_块=新字节[16];
字节[]一块返回=新字节[16];
byte[]all_block_return=新字节[data.Length];
对于(int i=0;i<块的数量;i++)
{
复制(数据,j,一个_块,0,16);
一块返回=一块操作(一块);
复制(一个块返回,0,所有块返回,j,16);
Array.Clear(一个块,0,一个块,长度);
j=j+16;
}
这段代码唯一的问题是速度太慢,因为我的数据数组非常大。因此,我期待着Array.Copy()的替代品,它比这个更快,或者如果有人有更好的方法来做这件事的话。我想知道有多少种方法可以做到这一点,并希望看到编码的变化


-谢谢

简单并行化怎么样

int number_of_blocks = (int)Math.Ceiling((double)data.Length / 16);
byte[] all_block_return = new byte[data.Length];

Parallel.For(0, number_of_blocks - 1, block_no =>
              {
                  var blockStart = block_no * 16; // 16 - block size
                  var blockLength = Math.Min(16, data.Length - blockStart);
                  byte[] one_block = new byte[16];
                  byte[] one_block_return = new byte[16];

                  Array.Copy(data, blockStart, one_block, 0, blockLength);

                  one_block_return = one_block_operation(one_block);

                  Array.Copy(one_block_return, 0, all_block_return, blockStart, blockLength);
              });
可以修改
一个块操作
以获取
数据、块开始、块开始+块长度
参数而不是缓冲区(
一个块
)?您可以避免使用
数组中的一个。复制

编辑: 以下是它的工作原理: 首先,我们需要计算块的数量。然后Parallel.For使用指定的参数执行:开始索引、结束索引和传递一个参数(当前已处理的索引)的委托。在我们的例子中,索引被认为是块的数目。与此代码等效的是:

for (var block_no = 0, block_no <= number_of_blocks - 1; block_no++) {
    delegate(block_no);
}

<代码> >(VaR BuffixNO.= 0,BuffyNo.<代码> >我的数据数组非常大。。长度是多少?考虑使用来自并行扩展插件的管道。这取决于用户。我希望我的用户能给出1GB或更多。@ DaRek“考虑使用来自并行扩展插件的管道”。---你能解释一下吗?@Giliweed看看这篇文章很抱歉,你的代码很晚才重播。但它是如何工作的?它是启动线程的吗?这里的“block_no”值是多少?你能解释一下你在第8行和第9行中到底做了什么吗?谢谢。我可以直接在第9行中给出16作为blocklength来跳过第9行吗Array.Copy?正如我们所知,“For()”有一个迭代计数(i++),但在这里如何计算迭代?代码运行良好,但我仍然不明白如何计算。我在解决方案中还发现了一个小错误:两个变量的贴花应该在委托内部(由于多线程访问)-请,也为您解决问题。非常感谢。您已经消除了我所有的困惑。现在我毫无疑问地接受您的答案。