Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
Arrays 数组中递增字节的结转_Arrays_Delphi - Fatal编程技术网

Arrays 数组中递增字节的结转

Arrays 数组中递增字节的结转,arrays,delphi,Arrays,Delphi,我正在测试我们的加密被破解的难易程度(或者说更快)。加密密钥是字节数组(可以是任何可变长度)。因此,从一个填充了所有0的数组开始,我需要从第一个字节开始,每次递增一个字节。当任何字节达到其最大值并返回0时,数组中的下一个字节需要递增(结转) 如果数组是一个短的固定长度,这将很简单,但我不知道如何在可变数组长度中这样做 线程内声明的变量: FKey: array of Byte; 在每次线程迭代后,它调用此过程将密钥增加一个字节: procedure TCrackThread.NextKey;

我正在测试我们的加密被破解的难易程度(或者说更快)。加密密钥是字节数组(可以是任何可变长度)。因此,从一个填充了所有0的数组开始,我需要从第一个字节开始,每次递增一个字节。当任何字节达到其最大值并返回0时,数组中的下一个字节需要递增(结转)

如果数组是一个短的固定长度,这将很简单,但我不知道如何在可变数组长度中这样做

线程内声明的变量:

FKey: array of Byte;
在每次线程迭代后,它调用此过程将密钥增加一个字节:

procedure TCrackThread.NextKey;
begin
  //Increment first byte
  //If max, reset to 0 and increment next byte
  //Recursively check the same for each following byte in array
end;

如何在这个可变长度数组中递增(从第一个开始)字节并结转到下一个?

此代码段将增加第一个元素,并将继续增加数组元素,只要它们是255。如果是,则将其重置为零。当条件未满足或指数达到最大值时,例程将立即停止

var
  k: Integer;
...
if (Length(fKey) > 0) then begin
  k := 0;
  Inc(fKey[k]);
  while (fKey[k] = 255) do begin
    fKey[k] := 0;
    Inc(k);
    if (k >= Length(fKey)) then
      break;
    Inc(fKey[k]);
  end;
end;
这将把数组254,0,0转换为0,1,0

如果希望进位在第一个增量之前波动, 此代码将执行以下操作:

procedure Next;
var
  k: Integer;
  carry: Boolean;
begin
  if (Length(fKey) > 0) then begin
    k := 0;
    repeat
      carry := (fKey[k] = 255);
      if carry then begin
        fKey[k] := 0;
        Inc(k);
        if (k >= Length(fKey)) then
          break;
      end
      else
        Inc(fKey[k]);
    until not carry;
  end;
end;

这将把255255,0转换成0,0,1。

当我读代码时,254,0,0的数组将增加到0,1,0,而不是像我相信的那样,255,0,0wants@crefird,“增量第一字节”254->255。“如果最大,则重置为0并增加下一个字节”。我相信我的解释符合OP的要求。@crefird,阅读问题的第二句,逻辑似乎有点模糊。我用一个例子更新了答案,包括你的解释。这可以概括一点。如果结果<其中一个操作数,则应设置进位。然后发生了溢出。@Rudy,是的,我知道,或者只是在增量后检查零。我只是想在这个编译器标志打开时避免溢出RT错误。如果有人感兴趣的话,可以很容易地将其关闭。我做了一个速度比较,差别只有百分之几。为了实现真正的速度,几条装配线可以解决这个问题。请注意,如果您有一个8字节(64位)的密钥,并且每秒可以测试10亿个密钥,那么测试所有密钥组合将花费近585年的时间。如果您使用的是已知的加密方法,那么破解配置文件也是已知的;你可以直接查一下,而不是去测量。如果您使用的是您刚刚编好的加密,但您正在努力计数,那么您可能做了错误的加密。