DEC 5.2 的 CRC-32 检查失败
CRC-32 check fails with DEC 5.2
我已经从 Delphi Encryption Compendium 5.2 中为 test/demonstrate 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;
您的断言基于以下 属性 持有:
CRC(arr + [CRC(arr)]) = 0
我在这里使用 +
来指示数组连接。
我相信 DEC 公开的特定 CRC32 实现没有这个 属性。 DEC 提供了三种 CRC32 变体,分别命名为 CRC_32
、CRC_32CCITT
和 CRC_32ZModem
。只有 CRC_32ZModem
具有您断言的 属性。
Serg suggests 你应该断言:
not CRC(arr + [not CRC(arr)]) = 0
适用于 CRC_32
和 CRC_32CCITT
,但不适用于 CRC_32ZModem
。
我已经从 Delphi Encryption Compendium 5.2 中为 test/demonstrate 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;
您的断言基于以下 属性 持有:
CRC(arr + [CRC(arr)]) = 0
我在这里使用 +
来指示数组连接。
我相信 DEC 公开的特定 CRC32 实现没有这个 属性。 DEC 提供了三种 CRC32 变体,分别命名为 CRC_32
、CRC_32CCITT
和 CRC_32ZModem
。只有 CRC_32ZModem
具有您断言的 属性。
Serg suggests 你应该断言:
not CRC(arr + [not CRC(arr)]) = 0
适用于 CRC_32
和 CRC_32CCITT
,但不适用于 CRC_32ZModem
。