delphi - DEC 5.2 CRC-32 检查失败

标签 delphi crc crc32

我编写了两个简单的按钮处理程序来测试/演示 Delphi Encryption Compendium 5.2 中的 CRC16 和 CRC32。 CRC16 的代码工作正常,但 CRC32 的验证总是失败。

我使用的是 512 字节数组,其中最后 2 或 4 个字节(对于 crc16 或 crc32)保留用于校验和。 CRC-32 的代码有什么问题?我的第一个想法是字节顺序有问题,但 crc16 代码也应该失败。

procedure TForm3.CRC16Click(Sender: TObject);
var
  LData: array[1..512] of Byte;
    FSum: Cardinal;
  FIntPtr: Pointer;
begin
  FillChar(LData, sizeof(LData), 0);
  LData[1] := $FF; // set some test data

  FSum := CRCCalc(CRC_16, LData, (SizeOf(LData)-sizeof(Word)));

  FIntPtr := @LData[512-1]; // don't get confused by -1...

  PWord(FIntPtr)^ := FSum and $FFFF;
  Assert( CRCCalc(CRC_16, LData, (SizeOf(LData))) = 0); // THIS WORKS!
end;

procedure TForm3.CRC32Click(Sender: TObject);
var
  LData: array[1..512] of Byte;
    FSum: Cardinal;
  FIntPtr: Pointer;
begin
  FillChar(LData, sizeof(LData), 0);
  LData[1] := $FF; // set some test data

  FSum := CRCCalc(CRC_32, LData, (SizeOf(LData)-sizeof(Cardinal)));

  FIntPtr := @LData[512-3]; // don't get confused by -3...

  PCardinal(FIntPtr)^ := FSum;
  Assert( CRCCalc(CRC_32, LData, (SizeOf(LData))) = 0); // ASSERT FAILURE! <<<
end;

最佳答案

您的主张基于以下属性(property)持有:

CRC(arr + [CRC(arr)]) = 0

我使用 + 来指示数组串联。

我相信 DEC 公开的特定 CRC32 实现不具有此属性。 DEC 提供三种 CRC32 变体,名为 CRC_32CRC_32CCITTCRC_32ZModem。只有 CRC_32ZModem 具有您断言的属性。

Serg suggests你应该断言:

not CRC(arr + [not CRC(arr)]) = 0

这适用于 CRC_32CRC_32CCITT,但不适用于 CRC_32ZModem

关于delphi - DEC 5.2 CRC-32 检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332517/

相关文章:

crc - 数据长度与 CRC 长度

xml - 如何使用 NativeXml 查找节点 : Delphi

c# - c#问题中的Xmodem-CRC协议(protocol)

security - CRC和散列方法(MD5,SHA1)之间的区别

c# - 在 c# 中使用 SSE 4.2 crc32 算法?是否可以?

具有已知 CRC 的级联输入的 CRC

delphi - 类或记录(<T>)

delphi - 选择要在 Inno Setup 卸载程序上卸载的自定义组件

德尔福: How to set sound/image locations?

c++ - Boost CRC问题: different results with the same parameters