mindong 发表于 2018-9-20 10:55:56

golang 仿python pack/unpack

package includes  

  
import (
  

"bytes"  
"encoding/binary"
  
"fmt"
  
_ "os"
  
"strconv"
  
"strings"
  
)
  

  
type Protocol struct {
  
Format []string
  
}
  

  
//封包
  
func (p *Protocol) Pack(args ...interface{}) []byte {
  
la := len(args)
  
ls := len(p.Format)
  
ret := []byte{}
  
if ls > 0 && la > 0 && ls == la {
  
for i := 0; i < ls; i++ {
  
if p.Format == "H" {
  
ret = append(ret, IntToBytes2(args.(int))...)
  
} else if p.Format == "I" {
  
ret = append(ret, IntToBytes4(args.(int))...)
  
} else if strings.Contains(p.Format, "s") {
  
num, _ := strconv.Atoi(strings.TrimRight(p.Format, "s"))
  
ret = append(ret, []byte(fmt.Sprintf("%s%s", args.(string), strings.Repeat("\x00", num-len(args.(string)))))...)
  
}
  
}
  
}
  
return ret
  
}
  

  
//解包
  
func (p *Protocol) UnPack(msg []byte) []interface{} {
  
la := len(p.Format)
  
ret := make([]interface{}, la)
  
if la > 0 {
  
for i := 0; i < la; i++ {
  
if p.Format == "H" {
  
ret = Bytes4ToInt(msg)
  
msg = msg
  
} else if p.Format == "I" {
  
ret = Bytes4ToInt(msg)
  
msg = msg
  
} else if strings.Contains(p.Format, "s") {
  
num, _ := strconv.Atoi(strings.TrimRight(p.Format, "s"))
  
ret = string(msg)
  
msg = msg
  

  
}
  
}
  
}
  
return ret
  
}
  


  
func (p *Protocol)>  
size := 0
  
ls := len(p.Format)
  
if ls > 0 {
  
for i := 0; i < ls; i++ {
  
if p.Format == "H" {

  
size =>  
} else if p.Format == "I" {

  
size =>  
} else if strings.Contains(p.Format, "s") {
  
num, _ := strconv.Atoi(strings.TrimRight(p.Format, "s"))

  
size =>  
}
  
}
  
}

  
return>  
}
  

  
//整形转换成字节
  
func IntToBytes(n int) []byte {
  
m := int32(n)
  
bytesBuffer := bytes.NewBuffer([]byte{})
  
binary.Write(bytesBuffer, binary.BigEndian, m)
  

  
gbyte := bytesBuffer.Bytes()
  

  
return gbyte
  
}
  

  
//整形转换成字节4位
  
func IntToBytes4(n int) []byte {
  
m := int32(n)
  
bytesBuffer := bytes.NewBuffer([]byte{})
  
binary.Write(bytesBuffer, binary.BigEndian, m)
  

  
gbyte := bytesBuffer.Bytes()
  
//c++ 高低位转换
  
k := 4
  
x := len(gbyte)
  
nb := make([]byte, k)
  
for i := 0; i < k; i++ {
  
nb = gbyte
  
}
  
return nb
  
}
  

  
//整形转换成字节2位
  
func IntToBytes2(n int) []byte {
  
m := int32(n)
  
bytesBuffer := bytes.NewBuffer([]byte{})
  
binary.Write(bytesBuffer, binary.BigEndian, m)
  

  
gbyte := bytesBuffer.Bytes()
  
//c++ 高低位转换
  
k := 2
  
x := len(gbyte)
  
nb := make([]byte, k)
  
for i := 0; i < k; i++ {
  
nb = gbyte
  
}
  
return nb
  
}
  

  
//字节转换成整形
  
func BytesToInt(b []byte) int {
  
bytesBuffer := bytes.NewBuffer(b)
  

  
var x int32
  
binary.Read(bytesBuffer, binary.BigEndian, &x)
  

  
return int(x)
  
}
  

  
//4个字节转换成整形
  
func Bytes4ToInt(b []byte) int {
  
xx := make([]byte, 4)
  
if len(b) == 2 {
  
xx = []byte{b, b, 0, 0}
  
} else {
  
xx = b
  
}
  

  
m := len(xx)
  
nb := make([]byte, 4)
  
for i := 0; i < 4; i++ {
  
nb = xx
  
}
  
bytesBuffer := bytes.NewBuffer(nb)
  

  
var x int32
  
binary.Read(bytesBuffer, binary.BigEndian, &x)
  

  
return int(x)
  
}


页: [1]
查看完整版本: golang 仿python pack/unpack