golang 仿python pack/unpack
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了golang 仿python pack/unpack,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3805字,纯文字阅读大概需要6分钟。
内容图文
![golang 仿python pack/unpack](/upload/InfoBanner/zyjiaocheng/1149/3ea79f8ecbd747c492fcf32352faedc4.jpg)
写得不完善也不完美 尤其是高低位转换那(go和c 二进制高地位相反 需要转换,还有go int转[]byte长度是4位),希望牛人看后指导一下
项目需要通过socket调取 客户端是go ,服务器端是python,由于需要封包解包,就参照python写的
python 的pack/unpack 参考 Python使用struct处理二进制(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[i] == "H" { ret = append(ret, IntToBytes2(args[i].(int))...) } elseif p.Format[i] == "I" { ret = append(ret, IntToBytes4(args[i].(int))...) } elseif strings.Contains(p.Format[i], "s") { num, _ := strconv.Atoi(strings.TrimRight(p.Format[i], "s")) ret = append(ret, []byte(fmt.Sprintf("%s%s", args[i].(string), strings.Repeat("\x00", num-len(args[i].(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[i] == "H" { ret[i] = Bytes4ToInt(msg[0:2]) msg = msg[2:len(msg)] } elseif p.Format[i] == "I" { ret[i] = Bytes4ToInt(msg[0:4]) msg = msg[4:len(msg)] } elseif strings.Contains(p.Format[i], "s") { num, _ := strconv.Atoi(strings.TrimRight(p.Format[i], "s")) ret[i] = string(msg[0:num]) msg = msg[num:len(msg)] } } } return ret } func (p *Protocol) Size() int { size := 0 ls := len(p.Format) if ls > 0 { for i := 0; i < ls; i++ { if p.Format[i] == "H" { size = size + 2 } elseif p.Format[i] == "I" { size = size + 4 } elseif strings.Contains(p.Format[i], "s") { num, _ := strconv.Atoi(strings.TrimRight(p.Format[i], "s")) size = size + num } } } return size } //整形转换成字节 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[i] = gbyte[x-i-1] } 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[i] = gbyte[x-i-1] } return nb } //字节转换成整形 func BytesToInt(b []byte) int { bytesBuffer := bytes.NewBuffer(b) var x int32 binary.Read(bytesBuffer, binary.BigEndian, &x) returnint(x) } //4个字节转换成整形 func Bytes4ToInt(b []byte) int { xx := make([]byte, 4) if len(b) == 2 { xx = []byte{b[0], b[1], 0, 0} } else { xx = b } m := len(xx) nb := make([]byte, 4) for i := 0; i < 4; i++ { nb[i] = xx[m-i-1] } bytesBuffer := bytes.NewBuffer(nb) var x int32 binary.Read(bytesBuffer, binary.BigEndian, &x) returnint(x) }
调用
p := new(Protocol) p.Format = []string{"H", "H", "I", "16s", "I", "I", "I"} h_byte := p.Pack(1, 1, 1, "abc", 1, 0, len(request_buf)) conn.Write(h_byte)
附加:
int 转 二进制 fmt.Printf("%08b\n", 97) // 01100001 二进制转int i, _ := strconv.ParseInt("1100001", 2, 32) //97int 转 []byte IntToBytes(1000) // [0 0 3 232] 3*256+232=1000 func IntToBytes(n int) []byte { m := int32(n) bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer, binary.BigEndian, m) gbyte := bytesBuffer.Bytes() return gbyte } []byte 转int BytesToInt([]byte{0,0,3,232}) //1000 func BytesToInt(b []byte) int { bytesBuffer := bytes.NewBuffer(b) var x int32 binary.Read(bytesBuffer, binary.BigEndian, &x) returnint(x) } int 转 bytebyte(97) //97
原文:http://www.cnblogs.com/wangxusummer/p/4397529.html
内容总结
以上是互联网集市为您收集整理的golang 仿python pack/unpack全部内容,希望文章能够帮你解决golang 仿python pack/unpack所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。