Files
wechat_ipad_pro/clientsdk/baseutils/utils.go

489 lines
12 KiB
Go
Raw Normal View History

2026-02-17 13:06:23 +08:00
package baseutils
import (
"bytes"
"encoding/binary"
"fmt"
"github.com/gogf/guuid"
"image/png"
"math/rand"
"strconv"
"strings"
"time"
"unsafe"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
// 转换16进制
var numberHexSmall = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}
var numberHexBig = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}
var stringBytes = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '-', '+'}
var bcd2Bytes = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?'}
// RandomUUID 随机生成UUID
func RandomUUID() string {
/*retAdSource := string("")
retAdSource = retAdSource + RandomBigHexString(8) + "-"
retAdSource = retAdSource + RandomBigHexString(4) + "-"
retAdSource = retAdSource + RandomBigHexString(4) + "-"
retAdSource = retAdSource + RandomBigHexString(4) + "-"
retAdSource = retAdSource + RandomBigHexString(12)*/
return guuid.New().String()
}
// RandomBSSID 随机生成RandomBSSID
func RandomBSSID() string {
retAdSource := string("")
retAdSource = retAdSource + RandomSmallHexString(2) + "-"
retAdSource = retAdSource + RandomSmallHexString(2) + "-"
retAdSource = retAdSource + RandomSmallHexString(2) + "-"
retAdSource = retAdSource + RandomSmallHexString(2) + "-"
retAdSource = retAdSource + RandomSmallHexString(2) + "-"
retAdSource = retAdSource + RandomSmallHexString(2)
return retAdSource
}
func BuildRandomMac() string {
// 00:00:00:00:00:00
macs := make([]string, 6)
for i := range macs {
macs[i] = fmt.Sprintf("%02X", rand.Intn(0xff))
}
return strings.Join(macs, ":")
}
// RandomBytes RandomBytes
func RandomBytes(length uint32) []byte {
retBytes := make([]byte, length)
tmpRand := rand.New(rand.NewSource(time.Now().UnixNano()))
var i uint32
for i = 0; i < length; i++ {
retBytes[i] = byte(tmpRand.Intn(256))
}
return retBytes
}
// RandomBigHexString RandomBigHexString
func RandomBigHexString(length uint32) string {
retBytes := make([]byte, length)
tmpRand := rand.New(rand.NewSource(time.Now().UnixNano()))
var i uint32
for i = 0; i < length; i++ {
tmpIndex := tmpRand.Intn(16)
retBytes[i] = numberHexBig[tmpIndex]
}
return string(retBytes)
}
// RandomSmallHexString RandomSmallHexString
func RandomSmallHexString(length uint32) string {
retBytes := make([]byte, length)
tmpRand := rand.New(rand.NewSource(time.Now().UnixNano()))
var i uint32
for i = 0; i < length; i++ {
tmpIndex := tmpRand.Intn(16)
retBytes[i] = numberHexSmall[tmpIndex]
}
return string(retBytes)
}
// RandomStringByLength 随机固定长度的字符串
func RandomStringByLength(length uint32) []byte {
retBytes := make([]byte, length)
tmpRand := rand.New(rand.NewSource(time.Now().UnixNano()))
tmpSize := len(stringBytes)
var index = uint32(0)
for index = 0; index < length; index++ {
tmpIndex := tmpRand.Intn(tmpSize)
retBytes[index] = stringBytes[tmpIndex]
}
return retBytes
}
// RandomString 随机长度的字符串
func RandomString(smallLength uint32, bigLength uint32) []byte {
if smallLength >= bigLength || smallLength <= 0 {
return []byte{}
}
tmpRand := rand.New(rand.NewSource(time.Now().UnixNano()))
tmpSize := bigLength - smallLength
tmpLength := uint32(tmpRand.Intn(int(tmpSize))) + smallLength
return RandomStringByLength(tmpLength)
}
// BytesToInt32 bytes 转 uint32
func BytesToInt32(bytesData []byte) uint32 {
length := len(bytesData)
if length < 4 {
tmpBytes := make([]byte, 4-length)
tmpBytes = append(tmpBytes, bytesData[0:]...)
return binary.BigEndian.Uint32(tmpBytes)
}
return binary.BigEndian.Uint32(bytesData)
}
// BytesToInt32SmallEndian 小端整形
func BytesToInt32SmallEndian(bytesData []byte) uint32 {
return binary.LittleEndian.Uint32(bytesData)
}
// Int32ToBytes uint32 转 bytes
func Int32ToBytes(int32Value uint32) []byte {
var buf = make([]byte, 4)
binary.BigEndian.PutUint32(buf, int32Value)
return buf
}
// UInt64ToBytes uint64 转 bytes
func UInt64ToBytes(int64Value uint64) []byte {
var buf = make([]byte, 8)
binary.BigEndian.PutUint64(buf, int64Value)
return buf
}
// BigEndianInt32ToLittleEndianInt32 大端整形 转成小端整形
func BigEndianInt32ToLittleEndianInt32(intValue uint32) uint32 {
tmpBytes := Int32ToBytes(intValue)
return binary.LittleEndian.Uint32(tmpBytes)
}
// Int32ToBytesLittleEndian uint32 转 bytes
func Int32ToBytesLittleEndian(int32Value uint32) []byte {
var buf = make([]byte, 4)
binary.LittleEndian.PutUint32(buf, int32Value)
return buf
}
// Int16ToBytesLittleEndian uint16 转 bytes
func Int16ToBytesLittleEndian(int16Value uint16) []byte {
var buf = make([]byte, 2)
binary.LittleEndian.PutUint16(buf, int16Value)
return buf
}
// Int16ToBytesBigEndian uint16 转 bytes
func Int16ToBytesBigEndian(int16Value uint16) []byte {
var buf = make([]byte, 2)
binary.BigEndian.PutUint16(buf, int16Value)
return buf
}
// BytesToUint16BigEndian bytes 转 uint16 BigEndian
func BytesToUint16BigEndian(bytesData []byte) uint16 {
return binary.BigEndian.Uint16(bytesData)
}
// BytesToUint16LittleEndian bytes 转 uint16 LittleEndian
func BytesToUint16LittleEndian(bytesData []byte) uint16 {
return binary.LittleEndian.Uint16(bytesData)
}
// Int2Byte int 转成 字节数组
func Int2Byte(data int) (ret []byte) {
var len = unsafe.Sizeof(data)
ret = make([]byte, len)
var tmp = 0xff
var index = uint(0)
for index = 0; index < uint(len); index++ {
ret[index] = byte((tmp << (index * 8) & data) >> (index * 8))
}
return ret
}
// DecodeVByte32 获取变长整形值 和 所占用的字节数
// data 变长整数的字节数组
// current : 数组的起始坐标, 从这个坐标开启解析变长整数
// return 解密后的整形、占用的字节数
func DecodeVByte32(data []byte, current uint32) (uint32, uint32) {
var index = uint32(0)
for data[current+index] >= 0x80 {
index++
}
var retLen = uint32(index + 1)
var value = uint32(0)
for index != 0 {
value <<= 7
value |= (uint32)(data[current+index] & 0x7f)
index--
}
value <<= 7
value |= (uint32)(data[current] & 0x7f)
return value, retLen
}
// EncodeVByte32 uint32 转成 变长整形字节数组
func EncodeVByte32(num uint32) []byte {
retBytes := make([]byte, 0)
tmpValue := num
for tmpValue >= 0x80 {
var tmpByte = byte(0)
tmpByte = byte(tmpValue%0x80 + 0x80)
tmpValue = tmpValue / 0x80
retBytes = append(retBytes, tmpByte)
}
var tmpByte = byte(tmpValue)
retBytes = append(retBytes, tmpByte)
return retBytes
}
// UInt32To16Bytes 整形转换成16进制字节数组
func UInt32To16Bytes(intValue uint32) []byte {
retBytes := make([]byte, 0)
tmpValue := intValue
for tmpValue > 0 {
modValue := tmpValue % 16
retBytes = append(retBytes, numberHexSmall[modValue])
tmpValue = tmpValue / 16
}
retBytes = reverse(retBytes)
return retBytes
}
// 反转字节数组
func reverse(data []byte) []byte {
retBytes := make([]byte, 0)
dataLen := len(data)
for dataLen > 0 {
retBytes = append(retBytes, data[dataLen-1])
dataLen = dataLen - 1
}
return retBytes
}
// HashCode 计算字符串hashcode
func HashCode(str string) uint32 {
tmpBytes := []byte(str)
tmpLen := len(tmpBytes)
var retHashCode = uint32(0)
for index := 0; index < tmpLen; index++ {
var tmpValue = uint32(tmpBytes[index])
retHashCode = 31*retHashCode + tmpValue
}
return retHashCode
}
// StringCut 截取字符串
// srcStr 待截取的字符串
// index 截取的开始索引
// length 截取的长度
func StringCut(srcStr string, index uint32, length uint32) string {
srcBytes := []byte(srcStr)
tmpBytes := make([]byte, 0)
tmpBytes = append(tmpBytes, srcBytes[index:index+length]...)
retString := string(tmpBytes)
return retString
}
// HexStringToBytes 16进制字符串 转bytes
func HexStringToBytes(hexString string) []byte {
retBytes := make([]byte, 0)
count := len(hexString)
for index := 0; index < count; index += 2 {
tmpStr := StringCut(hexString, uint32(index), 2)
value64, _ := strconv.ParseInt(tmpStr, 16, 16)
retBytes = append(retBytes, byte(value64))
}
return retBytes
}
// BytesToHexString 字节数组转16进制String
func BytesToHexString(data []byte, isBig bool) string {
changeBytes := numberHexSmall
if isBig {
changeBytes = numberHexBig
}
length := len(data)
retBytes := make([]byte, length*2)
for index := 0; index < length; index++ {
tmpByte := data[index]
highIndex := ((tmpByte & 0xf0) >> 4)
lowIndex := tmpByte & 0x0f
retBytes[index*2] = changeBytes[highIndex]
retBytes[index*2+1] = changeBytes[lowIndex]
}
return string(retBytes)
}
// EscapeURL 对Url特殊字符转译
func EscapeURL(srcURL string) string {
size := len(srcURL)
retURL := []byte{}
for index := 0; index < size; index++ {
// 转译:%
if srcURL[index] == '%' {
retURL = append(retURL, []byte("%25")[0:]...)
continue
}
// 转译:&
if srcURL[index] == '&' {
retURL = append(retURL, []byte("%26")[0:]...)
continue
}
// 转译:+
if srcURL[index] == '+' {
retURL = append(retURL, []byte("%2B")[0:]...)
continue
}
// 转译:/
if srcURL[index] == '/' {
retURL = append(retURL, []byte("%2F")[0:]...)
continue
}
// 转译:
if srcURL[index] == ':' {
retURL = append(retURL, []byte("%3A")[0:]...)
continue
}
// 转译:=
if srcURL[index] == '=' {
retURL = append(retURL, []byte("%3D")[0:]...)
continue
}
// 转译:?
if srcURL[index] == '?' {
retURL = append(retURL, []byte("%3F")[0:]...)
continue
}
retURL = append(retURL, srcURL[index])
}
return string(retURL)
}
// HongBaoStringToBytes HongBaoStringToBytes
func HongBaoStringToBytes(content string) string {
retBytes := []byte{}
tmpBytes := []byte(content)
count := len(tmpBytes)
for index := 0; index < count; index++ {
byteValue := tmpBytes[index]
if byteValue&0x80 != 0 {
high4Value := byteValue >> 4
low4Value := byteValue & 0xF
retBytes = append(retBytes, '%')
retBytes = append(retBytes, numberHexBig[high4Value])
retBytes = append(retBytes, numberHexBig[low4Value])
} else {
retBytes = append(retBytes, byteValue)
}
}
return string(retBytes)
}
// GetNumberString 获取前面的数字字符串
func GetNumberString(srcStr string) string {
retBytes := make([]byte, 0)
count := len(srcStr)
for index := 0; index < count; index++ {
if srcStr[index] >= '0' && srcStr[index] <= '9' {
retBytes = append(retBytes, srcStr[index])
} else {
break
}
}
return string(retBytes)
}
// BCD2ToASCII BCD2ToASCII
func BCD2ToASCII(ascString string) []byte {
retBytes := []byte{}
size := len(ascString)
if size%2 == 1 {
size = size + 1
ascString = "0" + ascString
}
tmpAscData := []byte(ascString)
for index := 0; index < size; index += 2 {
tmpByte := byte(0)
for index2 := byte(0); index2 < byte(16); index2++ {
if tmpAscData[index] == numberHexBig[index2] {
tmpByte = tmpByte + index2<<4
}
// 判断
if tmpAscData[index+1] == numberHexBig[index2] {
tmpByte = tmpByte + index2
}
}
retBytes = append(retBytes, tmpByte)
}
return retBytes
}
// ASCIIToBCD2 ASCIIToBCD2
func ASCIIToBCD2(ascData []byte, bFlag bool) []byte {
retBytes := []byte{}
exchangeBytes := bcd2Bytes
if bFlag {
exchangeBytes = numberHexBig
}
size := len(ascData)
for index := 0; index < size; index++ {
high4 := ascData[index] >> 4
low4 := ascData[index] & 0xF
retBytes = append(retBytes, exchangeBytes[high4])
retBytes = append(retBytes, exchangeBytes[low4])
}
return retBytes
}
// ParseInt 去掉除数字外的其他字符
func ParseInt(srcData string) uint32 {
retBytes := make([]byte, 0)
tmpLen := len(srcData)
for index := 0; index < tmpLen; index++ {
if srcData[index] >= '0' && srcData[index] <= '9' {
retBytes = append(retBytes, srcData[index])
}
}
retValue, err := strconv.Atoi(string(retBytes))
if err != nil {
return 0
}
return uint32(retValue)
}
// CreateQRCode 生成二维码
func CreateQRCode(data string) ([]byte, error) {
qrCode, _ := qr.Encode(data, qr.M, qr.Auto)
qrCode, _ = barcode.Scale(qrCode, 256, 256)
buffer := new(bytes.Buffer)
err := png.Encode(buffer, qrCode)
if err != nil {
return nil, err
}
return buffer.Bytes(), nil
}