2017-06-23 7 views
-3

Je suis à la recherche d'une fonction CRC-16/ARC en Delphi (Pascal).Je cherche CRC-16/ARC Delphi (Pascal) Fonction

Octets

 
5a 02 20 70 11 15 20 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 

valeur CRC:

0x79B9 

image

Voici quelques C++ code source:

unsigned short const crc16_table[256] = { 
     0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 
     0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 
     0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 
     0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 
     0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 
     0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 
     0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 
     0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 
     0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 
     0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 
     0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 
     0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 
     0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 
     0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 
     0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 
     0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 
     0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 
     0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 
     0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 
     0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 
     0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 
     0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 
     0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 
     0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 
     0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 
     0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 
     0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 
     0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 
     0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 
     0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 
     0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 
     0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 
}; 
//============================================================================ 
unsigned short crc16(unsigned short crc, unsigned char const *buffer, unsigned int len) 
{ 
     while (len--) 
       crc = (unsigned short)((crc >> 8)^(crc16_table[(crc^(*buffer++))&0xff])); 
     return crc; 
} 
+2

Bienvenue sur Stack Overflow. Ce n'est pas un service d'écriture de code, et nous ne sommes pas non plus un localisateur de liens. Merci de passer quelques minutes à parcourir le [tour] et à parcourir les pages [aide] afin de vous familiariser avec ce site et son fonctionnement. Bonne chance. (Et Google est une excellente source pour localiser des liens vers des choses, et son seul travail est de les trouver et de vous les montrer.) –

Répondre

2

La traduction de Delphi e Code e C++ que vous avez fourni ressemblera à ceci:

const 
    crc16_table: 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 
); 

function crc16(crc: Word; buffer: PByte; len: LongWord): Word; 
begin 
    while (len <> 0) do 
    begin 
    crc := Word((crc shr 8) xor crc16_table[(crc xor buffer^) and $FF]); 
    Inc(buffer); 
    Dec(len); 
    end; 
    Result := crc; 
end; 

Par exemple:

const 
    bytes: array[0..105] of Byte = (
    $5a, $02, $20, $70, $11, $15, $20, $26, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    $00, $00 
); 
var 
    crc: Word; 
begin 
    crc := crc16(0, @bytes[0], Length(bytes)); 
    // crc is $79B9 
end; 
+0

Merci monsieur, Vous êtes Life Saver xx, Cordialement. – Namyelus