| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | package networkimport (	"bytes"	"encoding/hex"	"strings")const (	hexTable  = "0123456789abcdefABCDEF"	hexPrefix = "0x")type Byte bytefunc (b Byte) Hex() string {	dst := make([]byte, 2)	dst[0] = hexTable[b>>4]	dst[1] = hexTable[b&0x0f]	// dst[2] = 32 // 单个字节转换时取消补充空格	return string(dst)}func (b Byte) String() string {	return b.Hex()}type Bytes []bytefunc (b Bytes) Hex() string {	if len(b) <= 0 {		return ""	}	dst := make([]byte, len(b)*3)	for i, v := range b {		dst[i*3] = hexTable[v>>4]		dst[i*3+1] = hexTable[v&0x0f]		dst[i*3+2] = 32 // 补充空格	}	dst = dst[:len(dst)-1]	return string(dst)}func (b Bytes) HexString() string {	if len(b) <= 0 {		return ""	}	dst := make([]byte, len(b)*2)	for i, v := range b {		dst[i*3] = hexTable[v>>4]		dst[i*3+1] = hexTable[v&0x0f]	}	dst = dst[:len(dst)-1]	return string(dst)}func (b Bytes) String() string {	return b.Hex()}// Hex2Bytes 字符串 s 转换为字节数组func Hex2Bytes(src string) ([]byte, bool) {	src = strings.ToLower(src)	src = strings.ReplaceAll(src, hexPrefix, "")	src = strings.ReplaceAll(src, " ", "")	dst, err := hex.DecodeString(src)	if err != nil {		return nil, false	}	return dst, true}// Hex2Byte 字符串 s 转换为字节func Hex2Byte(src string) (byte, bool) {	src = strings.TrimSpace(src)	src = strings.ToLower(src)	src = strings.TrimPrefix(src, hexPrefix)	dst, err := hex.DecodeString(src)	if err != nil {		return 0, false	}	return dst[0], true}// CRC16Modbus 使用 bs 创建用于 Modbus/TCP 协议 2 个字节的 CRC 校验码(CRC16)// 具体应用时需要使用 BigEndian (大端模式) 或 LittleEndian 转换func CRC16Modbus(bs []byte) uint16 {	var crc uint16 = 0xFFFF	for _, b := range bs {		crc ^= uint16(b)		for i := 0; i < 8; i++ {			if crc&1 != 0 {				crc >>= 1				crc ^= 0xA001			} else {				crc >>= 1			}		}	}	return crc}// Remake 重新分配 b 占用内存大小func Remake(b []byte) []byte {	if len(b) == 0 {		return []byte{}	}	n := make([]byte, len(b))	for i := 0; i < len(b); i++ {		n[i] = b[i]	}	return n}// BytesEqual 比较 src 和 dst 是否相等func BytesEqual(src, dst []byte) bool {	if len(src) != len(dst) {		return false	}	if cap(src) != cap(dst) {		src = Remake(src)		dst = Remake(dst)	}	return bytes.Equal(src, dst)}
 |