| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | 
							- package network
 
- import (
 
- 	"bytes"
 
- 	"encoding/hex"
 
- 	"strings"
 
- )
 
- const (
 
- 	hexTable  = "0123456789abcdefABCDEF"
 
- 	hexPrefix = "0x"
 
- )
 
- type Byte byte
 
- func (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 []byte
 
- func (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) 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)
 
- }
 
 
  |