首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请圣人帮翻译C语言的CRC校验码delphi代码

2013-06-25 
请高人帮翻译C语言的CRC校验码delphi代码#include crc.h#include stdint.hDWORD dwPolynomial 0x04c

请高人帮翻译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;

热点排行