所以我需要从字节数组中切掉前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);
偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数。
非常感谢任何帮助。
答案 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];
}