增加一个字节[]

Joh*_*ley 11 .net c#

我有一个 byte[] testKey = new byte[8];

这显然从所有字节开始为0.我想遍历所有字节并在循环的每次迭代中递增1,所以最终我经历了字节数组的所有可能性.我也想尽快做到这一点.是的,我正在努力写一个野蛮人.

更新 我得到了不安全的方法,它是最快的.但是,根据我的计算,使用.Net DESCryptoServiceProvider对每个密钥进行DES加密需要76,000,000,000年.10,000次加密需要1.3秒.感谢有史以来最无用的问题的所有令人敬畏的答案!

Mar*_*ell 12

顺便说一句,检查2 ^ 64个选项需要大量处理...

那么,最快的方法可能是使用Int64(aka long)或UInt64(ulong),并使用++?你真的需要byte[]吗?

作为一个hacky替代品,如何:

Array.Clear(data, 0, data.Length);
while (true)
{
  // use data here
  if (++data[7] == 0) if (++data[6] == 0)
    if (++data[5] == 0) if (++data[4] == 0)
      if (++data[3] == 0) if (++data[2] == 0)
        if (++data[1] == 0) if (++data[0] == 0) break;
}
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一另一种方法是使用不安全的代码与数组通信,就好像它是一个int64 ......凌乱.

unsafe static void Test() {
    byte[] data = new byte[8];
    fixed (byte* first = data) {
        ulong* value = (ulong*)first;
        do {
            // use data here
            *value = *value + 1;
        } while (*value != 0);
    }
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 7

这是增加数组值的方法:

int index = testKey.Length - 1;
while (index >= 0) {
   if (testKey[index] < 255) {
      testKey[index]++;
      break;
   } else {
      testKey[index--] = 0;
   }
}
Run Code Online (Sandbox Code Playgroud)

如果index是-1这个代码后,你已经迭代所有组合.

这比使用BitConverter略快,因为它不会为每次迭代创建一个新数组.

编辑:
一个小的性能测试表明,这比使用BitConverter快1400倍...