请高人帮翻译C语言的CRC校验码delphi代码
#include "crc.h"
#include <stdint.h>
DWORD dwPolynomial = 0x04c11db7;/*校验多项式*/
DWORD cal_crc(DWORD *ptr, int len)/*计算数据校验和*/
{
DWORD xbit;
DWORD data;
DWORD CRC = 0xFFFFFFFF; /* 将CRC值初始化为0xFFFFFFFF,即二进制数(32个1):11111111111111111111111111111111*/
while (len--) {/*len为int类型数据,为主调程序传来的数值,表示要计算多少个DWORD数据的检验和*/
xbit = 1<< 31;/*将数值1左移31位后赋给双字类型的变量xbit,结果内的值为0x80000000,即:10000000000000000000000000000000*/
/*xbit这个变量表示计算检验和的位的位置(31位直到0位)*/
data = *ptr++;/*取出ptr指针所指的内存中的值赋给data,然后ptr指向下一个值(DWORD类型)*/
for (int bits = 0; bits < 32; bits++) {/*for循环,运行32次*/
if (CRC & 0x80000000) {/*当CRC的最高位为1时*/
CRC <<= 1;/*CRC左移1位*/
CRC ^= dwPolynomial;/*CRC和dwPolynomial按位进行异或操作*/
}
else/*当CRC的最高位为0时*/
CRC <<= 1;/*CRC左移1位*/
if (data & xbit)/*如果data数据的当前计算位为1时进行以下异或运算,否则不异或*/
CRC ^= dwPolynomial;/*CRC和dwPolynomial按位进行异或操作*/
xbit >>= 1;/*xbit右移一位,右移后左边补0*/
}
}
return CRC;/*返回计算的检验和值*/
} c语言 CRC32
[解决办法]
const
dwPolynomial = $04c11db7; /*校验多项式*/
function cal_crc(ptr: PDWORD; len: integer): DWORD //计算数据校验和
var
iStart, bits : integer;
xbit, data, CRC : DWORD;
begin
iStart := 0;
CRC := 0xFFFFFFFF; // 将CRC值初始化为0xFFFFFFFF,即二进制数(32个1)
while (iStart < len) do
begin
xbit := 1 shl 31;
data := PDWORD(dword(ptr)+ iStart)^;
bits := 0;
while (bits < 32) do
begin
if (CRC and $80000000) = $80000000 then
begin
CRC := CRC shl 1;
CRC := CRC XOR dwPolynomial;
end else
CRC := CRC shl 1;
if (data and xbit) > 0 then
CRC := CRC XOR dwPolynomial;
xbit := xbit shr 1;
bits := bits + 1;
end;
iStart := iStart + 1;
end;
end.
//基本山就是上面的代码! 我没有测试过直接把比的代码翻译的!
[解决办法]
var
dwPolynomial: DWORD = $4C11DB7;
function cal_crc(ptr: PDWORD; len: Integer): DWORD; stdcall;
var
bits: Integer;
xbit, data, CRC: DWORD;
begin
CRC := $FFFFFFFF;
repeat
Dec(len);
xbit := 1;
xbit := xbit shl 31;
data := ptr^ + 1;
for bits := 0 to 31 do
begin
if (CRC and $80000000) <> 0 then
begin
CRC := CRC shr 1;
CRC := CRC xor dwPolynomial;
end
else
CRC := CRC shl 1;
if (data and xbit) <> 0 then
CRC := CRC xor dwPolynomial;
xbit := xbit shr 1;
end;
until (len <= 0);
Result := CRC;
end;