将Python代码转换为 Delphi 时出现问题

ego6inou  于 2023-10-18  发布在  Python
关注(0)|答案(1)|浏览(101)

我需要将Python代码转换为 Delphi ,但我不能。
Python代码是:

def crc32(data: bytes, initial):
crc = initial
for x in data:
    for k in range(8):
        if ((crc ^ x) & 0x01) == 1:
            crc = crc >> 1
            crc = crc ^ 0x04c11db7
        else:
            crc = crc >> 1
        x = x >> 1
crc &= 0xffffffff
return crc

但是当我翻译成 Delphi 代码时,我遇到了一个问题,问题是x = x >> 1
这是 Delphi 代码:

function TForm1.CalculateCRC32(const data: TBytes; initial: Cardinal): Cardinal;
var
  crc: Cardinal;
  x, z: Integer;
begin
 crc := initial;

 for x in data do
 begin
    for z := 0 to 7 do
    begin
      if ((crc xor x) and $01) = 1 then
      begin
        crc := crc shr 1;
        crc := crc xor $04c11db7;
      end
      else
      begin
       crc := crc shr 1;
      end;

      x := x shr 1; // here its the problem I have
    end;
 end;
 crc := crc and $ffffffff;
 Result := crc;
end;

我该怎么解决这个问题呢?先谢了。
我用的是 Delphi XE11.3
做一个测试,我做:

data := '123456780000000077000000';
bytedata := HexToBytes(data); //TBytes type

initDataStr := '$FFFFFFFF'; 
initData := Cardinal(StrToInt64(initDataStr));

result := CalculateCRC32(bytedata, initData); //The result should be 7085D2 in hexadecimal.
vaj7vani

vaj7vani1#

你可以试试这样

  • 但你在 Delphi 和Python循环和语法中有相同的基本错误。*
function TForm1.CalculateCRC32(const data: TBytes; initial: Cardinal): Cardinal;
var
  crc, x: Cardinal;
  i, z: Integer;
begin
  crc := initial;

  for i := 0 to High(data) do
  begin
    x := data[i];
    for z := 0 to 7 do
    begin
      if ((crc xor x) and $01) = 1 then
      begin
        crc := crc shr 1;
        crc := crc xor $04c11db7;
      end
      else
      begin
        crc := crc shr 1;
      end;

      x := x shr 1;
    end;
  end;

  crc := crc and $ffffffff;
  Result := crc;
end;

我只是通过使用z变量来调节逐位操作,以避免更改循环变量x,从而确保循环按预期运行。

相关问题