refactor(crc):重构CRC系列算法中对于模式的定义,限制其取值。
This commit is contained in:
		@@ -10,18 +10,28 @@ import (
 | 
			
		||||
	"github.com/howeyc/crc16"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CRC16Mode int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CCITT CRC16Mode = iota
 | 
			
		||||
	CCITT_FALSE
 | 
			
		||||
	SCSI
 | 
			
		||||
	IBM
 | 
			
		||||
	MBUS
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 根据给定的校验表类型生成对应的校验器
 | 
			
		||||
func hasherSelect(table string) crc16.Hash16 {
 | 
			
		||||
	switch table {
 | 
			
		||||
	case "CCITT":
 | 
			
		||||
func hasherSelect(mdoe CRC16Mode) crc16.Hash16 {
 | 
			
		||||
	switch mdoe {
 | 
			
		||||
	case CCITT:
 | 
			
		||||
		return crc16.NewCCITT()
 | 
			
		||||
	case "CCITT-FALSE":
 | 
			
		||||
	case CCITT_FALSE:
 | 
			
		||||
		return crc16.New(crc16.MakeTable(crc16.CCITTFalse))
 | 
			
		||||
	case "SCSI":
 | 
			
		||||
	case SCSI:
 | 
			
		||||
		return crc16.NewSCSI()
 | 
			
		||||
	case "IBM":
 | 
			
		||||
	case IBM:
 | 
			
		||||
		return crc16.NewIBM()
 | 
			
		||||
	case "MBUS":
 | 
			
		||||
	case MBUS:
 | 
			
		||||
		return crc16.New(crc16.MakeTable(crc16.MBUS))
 | 
			
		||||
	default:
 | 
			
		||||
		return crc16.NewIBM()
 | 
			
		||||
@@ -29,27 +39,27 @@ func hasherSelect(table string) crc16.Hash16 {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC16校验和,返回字节数组
 | 
			
		||||
func CRC16(data []byte, table ...string) []byte {
 | 
			
		||||
	crcTable := append(table, "IBM")
 | 
			
		||||
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, table ...string) string {
 | 
			
		||||
	return hex.EncodeToString(CRC16(data, table...))
 | 
			
		||||
func CRC16Hex(data []byte, mode ...CRC16Mode) string {
 | 
			
		||||
	return hex.EncodeToString(CRC16(data, mode...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算指定文件的CRC16校验和,返回字节数组
 | 
			
		||||
func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
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(table, "IBM")
 | 
			
		||||
	crcTable := append(mode, IBM)
 | 
			
		||||
	hasher := hasherSelect(crcTable[0])
 | 
			
		||||
	if _, err := io.Copy(hasher, f); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("未能读取指定文件的内容,%w", err)
 | 
			
		||||
@@ -58,8 +68,8 @@ func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算指定文件的CRC16校验和,返回十六进制字符串
 | 
			
		||||
func SumFileHex(file string, table ...string) (string, error) {
 | 
			
		||||
	hash, err := SumFile(file, table...)
 | 
			
		||||
func SumFileHex(file string, mode ...CRC16Mode) (string, error) {
 | 
			
		||||
	hash, err := SumFile(file, mode...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,14 +9,22 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CRC32Mode int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	IEEE CRC32Mode = iota
 | 
			
		||||
	Castagnoli
 | 
			
		||||
	Koopman
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 选择一个CRC32校验表
 | 
			
		||||
func tableSelect(table string) *crc32.Table {
 | 
			
		||||
	switch table {
 | 
			
		||||
	case "IEEE":
 | 
			
		||||
func tableSelect(mode CRC32Mode) *crc32.Table {
 | 
			
		||||
	switch mode {
 | 
			
		||||
	case IEEE:
 | 
			
		||||
		return crc32.IEEETable
 | 
			
		||||
	case "Castagnoli":
 | 
			
		||||
	case Castagnoli:
 | 
			
		||||
		return crc32.MakeTable(crc32.Castagnoli)
 | 
			
		||||
	case "Koopman":
 | 
			
		||||
	case Koopman:
 | 
			
		||||
		return crc32.MakeTable(crc32.Koopman)
 | 
			
		||||
	default:
 | 
			
		||||
		return crc32.IEEETable
 | 
			
		||||
@@ -24,27 +32,27 @@ func tableSelect(table string) *crc32.Table {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC32校验和,返回字节数组
 | 
			
		||||
func CRC32(data []byte, table ...string) []byte {
 | 
			
		||||
	crcTable := append(table, "IEEE")
 | 
			
		||||
func CRC32(data []byte, mode ...CRC32Mode) []byte {
 | 
			
		||||
	crcTable := append(mode, IEEE)
 | 
			
		||||
	hasher := crc32.New(tableSelect(crcTable[0]))
 | 
			
		||||
	hasher.Write(data)
 | 
			
		||||
	return hasher.Sum(nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC32校验和,返回十六进制字符串
 | 
			
		||||
func CRC32Hex(data []byte, table ...string) string {
 | 
			
		||||
	return hex.EncodeToString(CRC32(data, table...))
 | 
			
		||||
func CRC32Hex(data []byte, mode ...CRC32Mode) string {
 | 
			
		||||
	return hex.EncodeToString(CRC32(data, mode...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算指定文件的CRC32校验和,返回字节数组
 | 
			
		||||
func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
func SumFile(file string, mode ...CRC32Mode) ([]byte, error) {
 | 
			
		||||
	f, err := os.Open(file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("未能打开指定文件,%w", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	crcTable := append(table, "IEEE")
 | 
			
		||||
	crcTable := append(mode, IEEE)
 | 
			
		||||
	hasher := crc32.New(tableSelect(crcTable[0]))
 | 
			
		||||
	if _, err := io.Copy(hasher, f); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("未能读取指定文件的内容,%w", err)
 | 
			
		||||
@@ -53,8 +61,8 @@ func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算指定文件的CRC32校验和,返回十六进制字符串
 | 
			
		||||
func SumFileHex(file string, table ...string) (string, error) {
 | 
			
		||||
	hash, err := SumFile(file, table...)
 | 
			
		||||
func SumFileHex(file string, mode ...CRC32Mode) (string, error) {
 | 
			
		||||
	hash, err := SumFile(file, mode...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,19 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CRC64Mode int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ECMA CRC64Mode = iota
 | 
			
		||||
	ISO
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 选择一个CRC64校验表。
 | 
			
		||||
func tableSelect(table string) *crc64.Table {
 | 
			
		||||
	switch table {
 | 
			
		||||
	case "ECMA":
 | 
			
		||||
func tableSelect(mode CRC64Mode) *crc64.Table {
 | 
			
		||||
	switch mode {
 | 
			
		||||
	case ECMA:
 | 
			
		||||
		return crc64.MakeTable(crc64.ECMA)
 | 
			
		||||
	case "ISO":
 | 
			
		||||
	case ISO:
 | 
			
		||||
		return crc64.MakeTable(crc64.ISO)
 | 
			
		||||
	default:
 | 
			
		||||
		return crc64.MakeTable(crc64.ISO)
 | 
			
		||||
@@ -22,27 +29,27 @@ func tableSelect(table string) *crc64.Table {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC64校验和,返回字节数组。
 | 
			
		||||
func CRC64(data []byte, table ...string) []byte {
 | 
			
		||||
	crcTable := append(table, "ISO")
 | 
			
		||||
func CRC64(data []byte, mode ...CRC64Mode) []byte {
 | 
			
		||||
	crcTable := append(mode, ISO)
 | 
			
		||||
	hasher := crc64.New(tableSelect(crcTable[0]))
 | 
			
		||||
	hasher.Write(data)
 | 
			
		||||
	return hasher.Sum(nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC64校验和,返回十六进制字符串。
 | 
			
		||||
func CRC64Hex(data []byte, table ...string) string {
 | 
			
		||||
	return hex.EncodeToString(CRC64(data, table...))
 | 
			
		||||
func CRC64Hex(data []byte, mode ...CRC64Mode) string {
 | 
			
		||||
	return hex.EncodeToString(CRC64(data, mode...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算一个指定文件的CRC64校验和,返回字节数组。
 | 
			
		||||
func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
func SumFile(file string, mode ...CRC64Mode) ([]byte, error) {
 | 
			
		||||
	f, err := os.Open(file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("未能打开指定文件,%w", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	crcTable := append(table, "ISO")
 | 
			
		||||
	crcTable := append(mode, ISO)
 | 
			
		||||
	hasher := crc64.New(tableSelect(crcTable[0]))
 | 
			
		||||
	if _, err := io.Copy(hasher, f); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("未能读取指定文件的内容,%w", err)
 | 
			
		||||
@@ -51,8 +58,8 @@ func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算一个指定文件的CRC64校验和,返回十六进制字符串。
 | 
			
		||||
func SumFileHex(file string, table ...string) (string, error) {
 | 
			
		||||
	hash, err := SumFile(file, table...)
 | 
			
		||||
func SumFileHex(file string, mode ...CRC64Mode) (string, error) {
 | 
			
		||||
	hash, err := SumFile(file, mode...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,28 +9,43 @@ import (
 | 
			
		||||
	"github.com/sigurn/crc8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CRC8Mode int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ORIGIN CRC8Mode = iota
 | 
			
		||||
	CDMA2000
 | 
			
		||||
	DARC
 | 
			
		||||
	DVB_S2
 | 
			
		||||
	EBU
 | 
			
		||||
	I_CODE
 | 
			
		||||
	ITU
 | 
			
		||||
	MAXIM
 | 
			
		||||
	ROHC
 | 
			
		||||
	WCDMA
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 根据提供的校验表名称生成对应的校验表
 | 
			
		||||
func hasherSelect(table string) *crc8.Table {
 | 
			
		||||
	switch table {
 | 
			
		||||
	case "CRC8":
 | 
			
		||||
func hasherSelect(mode CRC8Mode) *crc8.Table {
 | 
			
		||||
	switch mode {
 | 
			
		||||
	case ORIGIN:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8)
 | 
			
		||||
	case "CDMA2000":
 | 
			
		||||
	case CDMA2000:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_CDMA2000)
 | 
			
		||||
	case "DARC":
 | 
			
		||||
	case DARC:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_DARC)
 | 
			
		||||
	case "DVB-S2":
 | 
			
		||||
	case DVB_S2:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_DVB_S2)
 | 
			
		||||
	case "EBU":
 | 
			
		||||
	case EBU:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_EBU)
 | 
			
		||||
	case "I-CODE":
 | 
			
		||||
	case I_CODE:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_I_CODE)
 | 
			
		||||
	case "ITU":
 | 
			
		||||
	case ITU:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_ITU)
 | 
			
		||||
	case "MAXIM":
 | 
			
		||||
	case MAXIM:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_MAXIM)
 | 
			
		||||
	case "ROHC":
 | 
			
		||||
	case ROHC:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_ROHC)
 | 
			
		||||
	case "WCDMA":
 | 
			
		||||
	case WCDMA:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8_WCDMA)
 | 
			
		||||
	default:
 | 
			
		||||
		return crc8.MakeTable(crc8.CRC8)
 | 
			
		||||
@@ -38,25 +53,25 @@ func hasherSelect(table string) *crc8.Table {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC8校验和,返回字节数组
 | 
			
		||||
func CRC8(data []byte, table ...string) []byte {
 | 
			
		||||
	crcTable := append(table, "CRC8")
 | 
			
		||||
func CRC8(data []byte, mode ...CRC8Mode) []byte {
 | 
			
		||||
	crcTable := append(mode, ORIGIN)
 | 
			
		||||
	return []byte{crc8.Checksum(data, hasherSelect(crcTable[0]))}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算给定字节数组的CRC8校验和,返回十六进制字符串
 | 
			
		||||
func CRC8Hex(data []byte, table ...string) string {
 | 
			
		||||
	return hex.EncodeToString(CRC8(data, table...))
 | 
			
		||||
func CRC8Hex(data []byte, mode ...CRC8Mode) string {
 | 
			
		||||
	return hex.EncodeToString(CRC8(data, mode...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算指定文件的CRC8校验和,返回字节数组
 | 
			
		||||
func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
func SumFile(file string, mode ...CRC8Mode) ([]byte, error) {
 | 
			
		||||
	f, err := os.Open(file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("未能打开指定文件,%w", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	crcTable := append(table, "CRC8")
 | 
			
		||||
	crcTable := append(mode, ORIGIN)
 | 
			
		||||
	var buf = make([]byte, 0)
 | 
			
		||||
	if _, err := f.Read(buf); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("读取指定文件内容出错,%w", err)
 | 
			
		||||
@@ -65,8 +80,8 @@ func SumFile(file string, table ...string) ([]byte, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算指定文件的CRC8校验和,返回十六进制字符串
 | 
			
		||||
func SumFileHex(file string, table ...string) (string, error) {
 | 
			
		||||
	crc, err := SumFile(file, table...)
 | 
			
		||||
func SumFileHex(file string, mode ...CRC8Mode) (string, error) {
 | 
			
		||||
	crc, err := SumFile(file, mode...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user