u16 CRC16(void * Buff_addr,u16 len)
{
u8 * dataPtr=(u8 *)Buff_addr;
u16 index=0;
u16 crc=0;
while(len--)
{
crc=(u8)(crc>>8)|(crc<<8);
crc^=dataPtr[index++];
crc^=(u8)(crc&0xff)>>4;
crc^=(crc<<8)<<4;
crc^=((crc&0xff)<<4)<<1;
}
return crc;
}
uj5u.com熱心網友回復:

獻上妹子一張~
uj5u.com熱心網友回復:
function CRC16(var Buff_addr; len: Word): Word;
var
index, crc: Word;
dataPtr: PChar;
begin
dataPtr := PChar(@Buff_addr);
index := 0;
crc := 0;
while (len > 0) do
begin
crc := Byte((crc shr 8) or (crc shl 8));
crc := crc xor Byte(dataPtr[index]);
Inc(index);
crc := crc xor Byte((crc and $ff) shr 4);
crc := crc xor (crc shl 8) shl 4;
crc := crc xor ((crc and $ff) shl 4) shl 1;
end;
Result := crc;
end;
uj5u.com熱心網友回復:
妹子丑,還帶游泳圈。你得給出u16, u8的定義,這兩個顯然是自定義型別或某型別的typedef
uj5u.com熱心網友回復:
要修改下,如下:
function CRC16(var Buff_addr; len: Word): Word;
var
index, crc: Word;
dataPtr: PChar;
begin
dataPtr := PChar(@Buff_addr);
index := 0;
crc := 0;
while (len > 0) do
begin
crc := Byte(crc shr 8) or (crc shl 8);
crc := crc xor Byte(dataPtr[index]);
Inc(index);
crc := crc xor Byte(crc and $ff) shr 4;
crc := crc xor (crc shl 8) shl 4;
crc := crc xor ((crc and $ff) shl 4) shl 1;
end;
Result := crc;
end;
uj5u.com熱心網友回復:
多謝,我試下!u16 就是雙位元組 unsigned short;
u8 unsigned char;
uj5u.com熱心網友回復:
還有點問題原先的函式定義是
function CRC16_Modbus(pByteInfo : PByte; iLength : integer);stdcall;external 'CRC16Modbus.dll';
現在改成
function CRC16(var Buff_addr; len: Word): Word;
編譯報錯,能不能兼容原來的定義?
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
可以
function CRC16_Modbus(pByteInfo: PByte; iLength : integer);stdcall;external 'CRC16Modbus.dll';
或者
function CRC16_Modbus(pByteInfo: PChar; iLength : integer);stdcall;external 'CRC16Modbus.dll';
function CRC16(pByteInfo: PChar; iLength : integer): Word;
uj5u.com熱心網友回復:
原來是這樣呼叫的var
Data:array[0..2048] of Byte;
iCount,iResult:Integer;
iResult := CRC16_Modbus(@Data,iCount);
現在我想直接替換成
iResult := CRC16(@Data,iCount); 這種方式~ 基本不會delphi!
uj5u.com熱心網友回復:
可以的,將CRC16定義為
function CRC16(pByteInfo: array of Byte;; iLength : integer): integer;
uj5u.com熱心網友回復:
如果這樣呼叫iResult := CRC16_Modbus(@Data,iCount);則定義為如下:
function CRC16(Buff_addr: PChar; len: integer): integer;
如果這樣呼叫iResult := CRC16_Modbus(Data,iCount);則定義為如下:
function CRC16(Buff_addr: array of Byte; len: integer): integer;
uj5u.com熱心網友回復:
function CRC16(Buff_addr: PChar; len: integer): integer;var
index, crc: integer;
dataPtr: PChar;
begin
dataPtr := Buff_addr;
index := 0;
crc := 0;
while (len > 0) do
begin
crc := Byte(crc shr 8) or (crc shl 8);
crc := crc xor Byte(dataPtr[index]);
Inc(index);
crc := crc xor Byte(crc and $ff) shr 4;
crc := crc xor (crc shl 8) shl 4;
crc := crc xor ((crc and $ff) shl 4) shl 1;
end;
Result := crc;
end; 編譯沒問題,一運行就報錯~ 從這句crc := crc xor Byte(dataPtr[index]); 就開始了
uj5u.com熱心網友回復:
CRC校驗是嗎?如果是的話,我這里有DELPHI的uj5u.com熱心網友回復:
我這個是專用的,怎么上傳檔案啊?uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
回圈里面少了一個Dec(len);不過也還是有問題, 例如要算{0x04,0x00,0x01} 正確應該是0x4bdb我和c語言里面的比較了一下,第一遍回圈的時候crc是對的,到第二遍回圈就出錯了~
uj5u.com熱心網友回復:
typeu16 = WORD;
u8 = Byte;
pu16 = PWORD;
pu8 = PByte;
function CRC16(Buff_addr : Pointer; Len : u16):u16;
var
dataPtr : PansiChar;
index, crc : u16;
begin
dataPtr := PAnsiChar(Buff_addr);
index := 0;
crc := 0;
while Len > 0 do
begin
crc := (crc shr 8)or(crc shl 8);
crc := crc xor u8(dataPtr[index]);
Inc(index);
crc := crc xor ((crc and $ff) shr 4);
crc := crc xor ((crc shl 8) shl 4);
crc := crc xor(((crc and $ff)shl 4)shl 1);
Dec(Len);
end;
Result := crc;
end;
和你的方式兼容
var
Data:array[0..2048] of Byte;
iCount,iResult:Integer;
iResult := CRC16_Modbus(@Data,iCount);
iResult := CRC16(@Data,iCount);
uj5u.com熱心網友回復:
不要用回圈,用查表法。你用c++的話就不用換了,呵呵
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130935.html
標籤:語言基礎/算法/系統設計
上一篇:關于delphi的MD5演算法
