2017-06-23 118 views
-3

我正在寻找Delphi(Pascal)中的CRC-16/ARC功能。我正在寻找CRC-16/ARC德尔福(Pascal)功能

字节:

 
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 

CRC值:

0x79B9 

image

下面是一些C++源码:

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

欢迎堆栈溢出。这不是代码编写服务,我们也不是链接定位器。请花几分钟时间参加[导览]并阅读[帮助]页面,以便熟悉本网站及其工作原理。祝你好运。 (谷歌是寻找链接的极好来源,它的唯一工作就是找到它们并将它们展示给你,你应该学会使用它。) –

回答

2

日的Delphi的翻译你提供的是这样的式C++代码:

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; 

例如:

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

谢谢先生,你是人生的救星xx,最诚挚的问候。 – Namyelus