crc.go 729 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package utils
  2. import (
  3. "sync"
  4. )
  5. // Cyclical Redundancy Checking
  6. type crc struct {
  7. once sync.Once
  8. table []uint16
  9. }
  10. var crcTb crc
  11. // CRC16 Calculate Cyclical Redundancy Checking
  12. func CRC16(bs []byte) uint16 {
  13. crcTb.once.Do(crcTb.initTable)
  14. val := uint16(0xFFFF)
  15. for _, v := range bs {
  16. val = (val >> 8) ^ crcTb.table[(val^uint16(v))&0x00FF]
  17. }
  18. return val
  19. }
  20. // initTable 初始化表
  21. func (c *crc) initTable() {
  22. crcPoly16 := uint16(0xa001)
  23. c.table = make([]uint16, 256)
  24. for i := uint16(0); i < 256; i++ {
  25. crc := uint16(0)
  26. b := i
  27. for j := uint16(0); j < 8; j++ {
  28. if ((crc ^ b) & 0x0001) > 0 {
  29. crc = (crc >> 1) ^ crcPoly16
  30. } else {
  31. crc = crc >> 1
  32. }
  33. b = b >> 1
  34. }
  35. c.table[i] = crc
  36. }
  37. }