Re: CRC 16
  Home FAQ Contact Sign in
it.comp.lang.delphi only
 
Advanced search
POPULAR GROUPS

more...

 Up
Re: CRC 16         

Group: it.comp.lang.delphi · Group Profile
Author: Alex
Date: Mar 13, 2007 09:36

Mi sembra di capire:

- passi il puntatore al 1° elemento della stringa (p)
- passi la lunghezza della stringa (n)
- passi una word per il risultato (crc16)

Nota: nel tuo caso, passa crc16 inizializzata a 0 (poiché 0 xor n = n)
le AnsiString credo facciano casino visto che potrebbero non essere
contigue quindi rimani su normali "string" 255 caratteri.

Esempio:
var
ugo: string;
ugocrc: word;
begin
ugocrc:= 0;
ugo:= 'cippirimerlo';
CalcCRC16(cippirimerlo[1], byte(cippirimerlo[0]), ugocrc),
ShowMessage(IntToStr(ugocrc));
end;

scriptors ha scritto:
> ho trovato in rete un po di esempi anche se tutte "Procedure"
>
> problema:
>
> ho una serie di byte dei quali calcolare il relativo CRC16
> una volta calcolato devo inserire i due byte in una posizione definita
>
> mi servirebbe, data una certa stringa (stringa perchè mi risulta più
> facile in base alle mie conoscenze attuali di delphi... praticamente
> stringa composta dai codici ASCII dey bytes in questione), di
> calcolarne il CRC16
>
> secondo me dovrei fare una function e non una procedure ... qualche
> help ???
>
>
> implementation
>
> procedure CalcCRC16(p: pointer; n: integer; var crc16: word);
> const
> crc16table: 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
> );
> type
> buffer = array[0..0] of byte;
> var
> i: integer;
> q: ^buffer;
> begin
> q := p;
> for i := 0 to n-1 do
> crc16 := hi(crc16) xor crc16table[ q^[i] xor lo(crc16) ];
> end;
>
> end.
>
no comments
diggit! del.icio.us! reddit!