728x90
반응형
pascal에 적용 할 수 있는 CCITT CRC16 함수를 소개해 드립니다.
unit crc16Unit;
interface
uses Classes, SysUtils;
const
CCITT16_INITIAL = $FFFF;
CCITT16_POLYNOMINAL = $1021;
{**
CCITT CRC16 값을 계산하여 반환합니다.
@param pBuffer CRC16 값을 계산할 데이터가 들어 있는 포인터
@param nLen CRC16 값을 계산할 데이터의 길이
@result 입력한 데이터에 대한 CCITT CRC16 값 ( 검증 : https://crccalc.com/ )
*}
function crc16(pBuffer: PByte; nLen: word): word; overload;
function crc16(pBuffer: PByte; nLen: word; Polynom, Initial: word): word; overload;
implementation
function crc16(pBuffer: PByte; nLen: word): word; overload;
begin
Result := crc16(pBuffer, nLen, CCITT16_POLYNOMINAL, CCITT16_INITIAL);
end;
function crc16(pBuffer: PByte; nLen: word; Polynom, Initial: word): word;
var
i, j: Integer;
begin
Result := Initial;
for i := 1 to nLen do
begin
Result := Result xor (pBuffer^ shl 8);
for j := 0 to 7 do
begin
if ((Result and $8000) <> 0) then
Result := (Result shl 1) xor Polynom
else
Result := Result shl 1;
end;
Inc(pBuffer);
end;
end;
end.
실행 결과 검증은 https://crccalc.com/ 에서 하시면 됩니다.
참고자료 : https://stackoverflow.com/questions/5139480/
'프로그래밍 > 델파이' 카테고리의 다른 글
[Delphi] Windows 95에서 Comctl32.dll로 인한 실행 문제 (0) | 2021.11.26 |
---|---|
[pascal] in 연산자의 "Constant expression violates subrange bounds" 오류 (0) | 2021.11.07 |
[pascal] 라디오 버튼 선택 동작 (0) | 2021.09.08 |
[pascal] 16진, 10진 숫자 문자열을 정수형으로 변환하기 (StrToInt) (0) | 2021.09.07 |
Lazarus 크로스 컴파일을 통한 Windows 95용 어플 만들기 실패의 기록 (0) | 2021.08.19 |