package util import ( "basic.com/pubsub/protomsg.git" "bytes" "encoding/json" "errors" "github.com/gin-gonic/gin" "github.com/golang/glog" "github.com/pierrec/lz4" "gocv.io/x/gocv" "image" "net" "os/exec" "strconv" "webserver/extend/code" "crypto/rand" "fmt" "reflect" "strings" ) // iterater field of struct to lowcast. // return type: string slice. func FiledbyStuct(stuct interface{}) []string { var strtmp []string t := reflect.TypeOf(stuct) for i := 0; i < t.NumField(); i++ { strtmp = append(strtmp, strings.ToLower(string(t.Field(i).Name))) } return strtmp } // // ResponseFormat 返回数据格式化 func ResponseFormat(c *gin.Context, respStatus *code.Code, data interface{}) { if respStatus == nil { glog.Error("response status param not found!") respStatus = code.RequestParamError } c.JSON(respStatus.Status, gin.H{ "code": respStatus.Status, "success": respStatus.Success, "msg": respStatus.Message, "data": data, }) return } func PseudoUuid() (uuid string) { b := make([]byte, 16) rand.Read(b) uuid = fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]) return } //struct转map func Struct2Map(obj interface{}) map[string]interface{} { resultMap :=make(map[string]interface{},0) bytesData, err := json.Marshal(obj) if err !=nil { return resultMap } json.Unmarshal(bytesData, &resultMap) return resultMap // //t := reflect.TypeOf(obj) //v := reflect.ValueOf(obj) // //var data = make(map[string]interface{}) //for i := 0; i < t.NumField(); i++ { // data[t.Field(i).Name] = v.Field(i).Interface() //} //return data } // 按尺寸去切图 func SubImg(i protomsg.Image, x0, y0, x1, y1 int, ) []byte { img, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data) rect := image.Rect(EnlargeSize(x0, y0, x1, y1, i)) region := img.Region(rect) bytes, _ := gocv.IMEncode(".jpg", region) return bytes } // 长宽变为一比一,每边各扩百分之20 func EnlargeSize(x0, y0, x1, y1 int, i protomsg.Image) (x0_new, y0_new, x1_new, y1_new int) { // 先把长宽变为一比一 chazhi := (y1 - y0) - (x1 - x0) x0 = x0 - chazhi/2 if x0 < 0 { x0 = 0 } x1 = x1 + chazhi/2 if x1 > int(i.Width) { x1 = int(i.Width) } // 再把每边各扩大百分之20 enlarge := float32(0.2) x0_new = int((1+enlarge)*float32(x0) - enlarge*float32(x1)) if x0_new < 0 { x0_new = 0 } x1_new = int((1+enlarge)*float32(x1) - enlarge*float32(x0)) if x1_new > int(i.Width) { x1_new = int(i.Width) } y0_new = int((1+enlarge)*float32(y0) - enlarge*float32(y1)) if y0_new < 0 { y0_new = 0 } y1_new = int((1+enlarge)*float32(y1) - enlarge*float32(y0)) if y1_new > int(i.Height) { y1_new = int(i.Height) } return } // 获取本机网卡IP func GetLocalIP(networkName string) (ipv4 string,mask string, err error) { interfaces, err := net.Interfaces() if err != nil { return "","", err } for _, i := range interfaces { byName, err := net.InterfaceByName(i.Name) if err != nil { return "","", err } addresses, err := byName.Addrs() for _, v := range addresses { if ipnet, ok:=v.(*net.IPNet);ok && !ipnet.IP.IsLoopback(){ if ipnet.IP.To4() !=nil{ if byName.Name == networkName{ maskStr := ipnet.Mask.String() mask64, _ := strconv.ParseUint(maskStr, 16, 32) return ipnet.IP.String(),IpIntToString(int(mask64)),nil } } } } } return "","", errors.New("ipv4 not found") } func GetDefaultRoute(networkName string)(route string,err error){ cmdStr := fmt.Sprintf("route | grep -P \"^default.*%s$\" | awk '{print $2}'",networkName) cmd := exec.Command("/bin/sh","-c",cmdStr) b, err := cmd.Output() if err!=nil{ return "",err } return string(b),nil } func StringIpToInt(ipstring string) int { ipSegs := strings.Split(ipstring, ".") var ipInt int = 0 var pos uint = 24 for _, ipSeg := range ipSegs { tempInt, _ := strconv.Atoi(ipSeg) tempInt = tempInt << pos ipInt = ipInt | tempInt pos -= 8 } return ipInt } func IpIntToString(ipInt int) string{ ipSegs := make([]string, 4) var len int = len(ipSegs) buffer := bytes.NewBufferString("") for i := 0; i < len; i++ { tempInt := ipInt & 0xFF ipSegs[len-i-1] = strconv.Itoa(tempInt) ipInt = ipInt >> 8 } for i := 0; i < len; i++ { buffer.WriteString(ipSegs[i]) if i < len-1 { buffer.WriteString(".") } } return buffer.String() } func ParseScore(compareScore float32) float32 { if compareScore < 1 { compareScore = compareScore * 100 } f, _ := strconv.ParseFloat(fmt.Sprintf("%2.2f", compareScore), 32) return float32(f) } // UnCompress uncompress func UnCompress(in []byte) ([]byte, error) { out := make([]byte, 10*len(in)) n, err := lz4.UncompressBlock(in, out) if err != nil { fmt.Println(err) return nil, err } out = out[:n] // uncompressed data return out, nil } // Compress compress func Compress(in []byte) ([]byte, error) { out := make([]byte, len(in)) ht := make([]int, 64<<10) // buffer for the compression table n, err := lz4.CompressBlock(in, out, ht) if err != nil { fmt.Println(err) return nil, err } if n >= len(in) { fmt.Println("image is not compressible") } out = out[:n] // compressed data return out, nil }