package utils import ( "sync" ) // Cyclical Redundancy Checking type crc struct { once sync.Once table []uint16 } var crcTb crc // CRC16 Calculate Cyclical Redundancy Checking func CRC16(bs []byte) uint16 { crcTb.once.Do(crcTb.initTable) val := uint16(0xFFFF) for _, v := range bs { val = (val >> 8) ^ crcTb.table[(val^uint16(v))&0x00FF] } return val } // initTable 初始化表 func (c *crc) initTable() { crcPoly16 := uint16(0xa001) c.table = make([]uint16, 256) for i := uint16(0); i < 256; i++ { crc := uint16(0) b := i for j := uint16(0); j < 8; j++ { if ((crc ^ b) & 0x0001) > 0 { crc = (crc >> 1) ^ crcPoly16 } else { crc = crc >> 1 } b = b >> 1 } c.table[i] = crc } }