// 提供CRC16校验和计算功能。 package crc16 import ( "encoding/hex" "fmt" "io" "os" "github.com/howeyc/crc16" ) type CRC16Mode int const ( CCITT CRC16Mode = iota CCITT_FALSE SCSI IBM MBUS ) // 根据给定的校验表类型生成对应的校验器 func hasherSelect(mdoe CRC16Mode) crc16.Hash16 { switch mdoe { case CCITT: return crc16.NewCCITT() case CCITT_FALSE: return crc16.New(crc16.MakeTable(crc16.CCITTFalse)) case SCSI: return crc16.NewSCSI() case IBM: return crc16.NewIBM() case MBUS: return crc16.New(crc16.MakeTable(crc16.MBUS)) default: return crc16.NewIBM() } } // 计算给定字节数组的CRC16校验和,返回字节数组 func CRC16(data []byte, mode ...CRC16Mode) []byte { crcTable := append(mode, IBM) hasher := hasherSelect(crcTable[0]) hasher.Write(data) return hasher.Sum(nil) } // 计算给定字节数组的CRC16校验和,返回十六进制字符串 func CRC16Hex(data []byte, mode ...CRC16Mode) string { return hex.EncodeToString(CRC16(data, mode...)) } // 计算指定文件的CRC16校验和,返回字节数组 func SumFile(file string, mode ...CRC16Mode) ([]byte, error) { f, err := os.Open(file) if err != nil { return nil, fmt.Errorf("未能打开指定文件,%w", err) } defer f.Close() crcTable := append(mode, IBM) hasher := hasherSelect(crcTable[0]) if _, err := io.Copy(hasher, f); err != nil { return nil, fmt.Errorf("未能读取指定文件的内容,%w", err) } return hasher.Sum(nil), nil } // 计算指定文件的CRC16校验和,返回十六进制字符串 func SumFileHex(file string, mode ...CRC16Mode) (string, error) { hash, err := SumFile(file, mode...) if err != nil { return "", err } return hex.EncodeToString(hash), nil }