489 lines
12 KiB
Go
489 lines
12 KiB
Go
|
|
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
|
|||
|
|
}
|