将数组拆分为两个时出错

时间:2016-01-31 13:47:22

标签: c# arrays

所以我需要从字节数组中切掉前16个字节。我在Stack Overflow上看到的另一篇文章使用以下代码:

//split message into iv and encrypted bytes
byte[] iv = new byte[16];
byte[] workingHash = new byte[rage.Length - 16];

//put first 16 bytes into iv
for (int i = 0; i < 16; i++)
{
    iv[i] = rage[i];
}

Buffer.BlockCopy(rage, 16, workingHash, 0, rage.Length);

我们在这里尝试的是切断byte[] rage的前16个字节,然后将其余部分放入byte[] workingHash

错误发生在Buffer.BlockCopy(rage, 16, workingHash, 0, rage.Length);

  

偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

问题很简单:Buffer.BlockCopy的最后一个参数需要复制正确的字节数,(考虑起始索引)可能不超过数组的界限( docs)。

因此代码应如下所示,避免任何for个循环:

Buffer.BlockCopy(rage, 0, iv, 0, 16);
Buffer.BlockCopy(rage, 16, workingHash, 0, rage.Length - 16);

注意第二行的“- 16”,修复原始代码。为了保持一致性,第一行替换for周期。

答案 1 :(得分:1)

假设rage是一个长度为20的byte数组:

var rage = new byte[20]
{
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
};

byte[] iv = new byte[16];之后,iv将包含:

{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }

byte[] workingHash = new byte[rage.Length - 16];之后,workingHash将包含:

{ 0, 0, 0, 0 }

for循环iv之后:

{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }

你需要:

Buffer.BlockCopy(rage, 16, workingHash, 0, rage.Length - 16);

从第0个元素开始,将rage.Length - 16(4)元素从rage的第16个元素(17)复制到workingHash

结果:

{ 17, 18, 19, 20 }

顺便提一下,有一种非常易读的方式,可能没有复制数组那么快,但值得一提的是:

var firstSixteenElements = rage.Take(16).ToArray();
var remainingElements = rage.Skip(16).ToArray();

答案 2 :(得分:-1)

修正:

                //split message into iv and encrypted bytes
                byte[] iv = new byte[16];
                byte[] workingHash = new byte[rage.Length - 16];

                //put first 16 bytes into iv
                for (int i = 0; i < 16; i++)
                {
                    iv[i] = rage[i];
                }

                for (int i = 0; i < rage.Length - 16; i++)
                {
                    workingHash[i] = rage[i + 16];
                }