ho dimenticato il puntatore
CalcCRC16(^cippirimerlo[1], byte(cippirimerlo[0]), ugocrc)
o Pcar
Alex ha scritto:
> 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.
>>