123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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
- }
- }
|