안녕하세요.
음 하다가 막히는 부분이 있어 이렇게 글을 올립니다.
아래 평션은 사부가 만든건데 1년전에 그만 둬서....쩝.
초보인 저로서는 이걸 해야 하는데 분석조차 참 힘드네요..
여기서 CRCMASK = #223 입니다.
//======================================== 수신 Data CRC Check
function CkCRC( sStr : String ) : Boolean;
var
i : integer;
sum, crc : Char;
begin
sum := #0;
for i:=2 to Length( sStr )-2 do
sum := Chr( Ord(sum) + Ord(sStr[i]) );
crc := Chr( Ord(sum) and Ord(CRCMASK) );
if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );
if sStr[Length(sStr)-1] = crc then Result := True
else Result := False;
end;
//========================================== 송신할 Data의 CRC를 만든다.
function CRCMake( SendStr : String ) : Char;
var
i : integer;
sum, crc : Char;
begin
sum := #0;
for i:=3 to Length(SendStr) do
sum := Chr( Ord(sum) + Ord(SendStr[i]) );
crc := Chr( Ord(sum) and Ord(CRCMASK) );
if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );
Result := crc;
end;
SendStr, Str 모두 ABC 가 들어왔다고 가정하면
값이 어떻게 되는지요?
설명도 좀 부탁드립니다..그럼.
> 안녕하세요.
> 음 하다가 막히는 부분이 있어 이렇게 글을 올립니다.
> 아래 평션은 사부가 만든건데 1년전에 그만 둬서....쩝.
> 초보인 저로서는 이걸 해야 하는데 분석조차 참 힘드네요..
>
> 여기서 CRCMASK = #223 입니다.
>
>
> //======================================== 수신 Data CRC Check
> function CkCRC( sStr : String ) : Boolean;
> var
> i : integer;
> sum, crc : Char;
> begin
> sum := #0;
>
> for i:=2 to Length( sStr )-2 do
> sum := Chr( Ord(sum) + Ord(sStr[i]) );
> crc := Chr( Ord(sum) and Ord(CRCMASK) );
> if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );
>
> if sStr[Length(sStr)-1] = crc then Result := True
> else Result := False;
> end;
>
> //========================================== 송신할 Data의 CRC를 만든다.
> function CRCMake( SendStr : String ) : Char;
> var
> i : integer;
> sum, crc : Char;
> begin
> sum := #0;
>
> for i:=3 to Length(SendStr) do
> sum := Chr( Ord(sum) + Ord(SendStr[i]) );
> crc := Chr( Ord(sum) and Ord(CRCMASK) );
> if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );
>
> Result := crc;
> end;
>
> SendStr, Str 모두 ABC 가 들어왔다고 가정하면
> 값이 어떻게 되는지요?
> 설명도 좀 부탁드립니다..그럼.
>
제가 쓰는 방식은 crc table을 배열로 정의해놓고 쓰는데 참고하세요..
crc mask값은 일반적으로 #255값을 쓰는데 이분은 아마도 프로토콜상에 lock을
하기위해 mask값을 바꾼것 같군요..
function Crc16Process(nDp: PChar; const nSize: Word): Word;
const
//==================================================================================================
// > CRC Table Define
//--------------------------------------------------------------------------------------------------
nCrcTable: array[0..255] of Word = (
$0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241,$C601,$06C0,$0780,$C741,$0500,$C5C1,
$C481,$0440,$CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,$CE81,$0E40,$0A00,$CAC1,$CB81,$0B40,
$C901,$09C0,$0880,$C841,$D801,$18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40,$1E00,$DEC1,
$DF81,$1F40,$DD01,$1DC0,$1C80,$DC41,$1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,$D641,
$D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040,$F001,$30C0,$3180,$F141,$3300,$F3C1,
$F281,$3240,$3600,$F6C1,$F781,$3740,$F501,$35C0,$3480,$F441,$3C00,$FCC1,$FD81,$3D40,
$FF01,$3FC0,$3E80,$FE41,$FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840,$2800,$E8C1,
$E981,$2940,$EB01,$2BC0,$2A80,$EA41,$EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,$EC81,$2C40,
$E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640,$2200,$E2C1,$E381,$2340,$E101,$21C0,
$2080,$E041,$A001,$60C0,$6180,$A141,$6300,$A3C1,$A281,$6240,$6600,$A6C1,$A781,$6740,
$A501,$65C0,$6480,$A441,$6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41,$AA01,$6AC0,
$6B80,$AB41,$6900,$A9C1,$A881,$6840,$7800,$B8C1,$B981,$7940,$BB01,$7BC0,$7A80,$BA41,
$BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40,$B401,$74C0,$7580,$B541,$7700,$B7C1,
$B681,$7640,$7200,$B2C1,$B381,$7340,$B101,$71C0,$7080,$B041,$5000,$90C1,$9181,$5140,
$9301,$53C0,$5280,$9241,$9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440,$9C01,$5CC0,
$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40,$5A00,$9AC1,$9B81,$5B40,$9901,$59C0,$5880,$9841,
$8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,$4A40,$4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,
$4C80,$8C41,$4400,$84C1,$8581,$4540,$8701,$47C0,$4680,$8641,$8201,$42C0,$4380,$8341,
$4100,$81C1,$8081,$4040 );
//--------------------------------------------------------------------------------------------------
var
nComb_val,nAccp,nLen: Word;
begin
nAccp := 0;
for nLen := 0 to Pred(nSize) do begin
nComb_val := nAccp xor Word(nDp[nLen]);
nAccp := ((nAccp shr 8) xor nCrcTable[nComb_val and $00FF]);
end;
Result := nAccp;
end;