C#私有函数IncrementArray
本文关键字:IncrementArray 函数 | 更新日期: 2023-09-27 17:59:07
有人能用外行的话解释一下这个C#代码的工作原理吗?
for (int pos = 0; pos < EncryptedData.Length; pos += AesKey.Length);
{
Array.Copy(incPKGFileKey, 0, PKGFileKeyConsec, pos, PKGFileKey.Length);
IncrementArray(ref incPKGFileKey, PKGFileKey.Length - 1);
}
private Boolean IncrementArray(ref byte[] sourceArray, int position)
{
if (sourceArray[position] == 0xFF)
{
if (position != 0)
{
if (IncrementArray(ref sourceArray, position - 1))
{
sourceArray[position] = 0x00;
return true;
}
else return false;
}
else return false;
}
else
{
sourceArray[position] += 1;
return true;
}
}
我正试图将一个应用程序移植到Ruby,但我很难理解IncrementArray函数是如何工作的。
IncrementArray
递增字节数组的所有项,任何溢出都会添加到上一个索引,除非它已经是索引0。整个东西看起来像某种加密或解密代码。您可能需要查找有关使用哪种算法的其他提示,因为这类代码通常无法自我解释。
在我看来,它就像一个大端加法算法:
假设您有一个长(64位,8字节)数字:
var bigNumber = 0x123456FFFFFFFF;
但出于某种原因,我们将其作为大端格式的字节数组:
// Get the little endian byte array representation of the number:
// [0xff 0xff 0xff 0xff 0xff 0x56 0x34 0x12]
byte[] source = BitConverter.GetBytes(bigNumber);
// BigEndian-ify it by reversing the byte array
source = source.Reverse().ToArray();
所以现在你想在这个"数字"的当前形式上加一个,同时像在普通算术中一样保持任何进位/溢出:
// increment the least significant byte by one, respecting carry
// (as it's bigendian, the least significant byte will be the last one)
IncrementArray(ref source, source.Length-1);
// we'll re-little-endian-ify it so we can convert it back
source = source.Reverse().ToArray();
// now we convert the array back into a long
var bigNumberIncremented = BitConverter.ToInt64(source, 0);
// Outputs: "Before +1:123456FFFFFFFF"
Console.WriteLine("Before +1:" + bigNumber);
// Outputs: "After +1:12345700000000"
Console.WriteLine("After +1:" + bigNumberIncremented);