golang 仿python pack/unpack
写得不完善也不完美 尤其是高低位转换那(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 > && la > && ls == la {
for i := ; i < ls; i++ {
if p.Format[i] == "H" {
ret = append(ret, IntToBytes2(args[i].(int))...)
} else if p.Format[i] == "I" {
ret = append(ret, IntToBytes4(args[i].(int))...)
} else if 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 > {
for i := ; i < la; i++ {
if p.Format[i] == "H" {
ret[i] = Bytes4ToInt(msg[:])
msg = msg[:len(msg)]
} else if p.Format[i] == "I" {
ret[i] = Bytes4ToInt(msg[:])
msg = msg[:len(msg)]
} else if strings.Contains(p.Format[i], "s") {
num, _ := strconv.Atoi(strings.TrimRight(p.Format[i], "s"))
ret[i] = string(msg[:num])
msg = msg[num:len(msg)] }
}
}
return ret
} func (p *Protocol) Size() int {
size :=
ls := len(p.Format)
if ls > {
for i := ; i < ls; i++ {
if p.Format[i] == "H" {
size = size +
} else if p.Format[i] == "I" {
size = size +
} else if 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 :=
x := len(gbyte)
nb := make([]byte, k)
for i := ; i < k; i++ {
nb[i] = gbyte[x-i-]
}
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 :=
x := len(gbyte)
nb := make([]byte, k)
for i := ; i < k; i++ {
nb[i] = gbyte[x-i-]
}
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, )
if len(b) == {
xx = []byte{b[], b[], , }
} else {
xx = b
} m := len(xx)
nb := make([]byte, )
for i := ; i < ; i++ {
nb[i] = xx[m-i-]
}
bytesBuffer := bytes.NewBuffer(nb) var x int32
binary.Read(bytesBuffer, binary.BigEndian, &x) return int(x)
}
调用
p := new(Protocol)
p.Format = []string{"H", "H", "I", "16s", "I", "I", "I"}
h_byte := p.Pack(, , , "abc", , , len(request_buf))
conn.Write(h_byte)
附加:
int 转 二进制 fmt.Printf("%08b\n", ) // 二进制转int i, _ := strconv.ParseInt("", , ) // int 转 []byte IntToBytes() // [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{,,,}) // func BytesToInt(b []byte) int {
bytesBuffer := bytes.NewBuffer(b) var x int32
binary.Read(bytesBuffer, binary.BigEndian, &x) return int(x)
} int 转 byte byte() //
golang 仿python pack/unpack的更多相关文章
- python struct中的pack unpack
python struct中的pack unpack pytyon tuple元组 print struct.unpack("!ihb", buffer) 结果为7 //pyth ...
- PHP: 深入pack/unpack
https://my.oschina.net/goal/blog/195749 PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性 ...
- PHP: 深入pack/unpack 字节序
http://my.oschina.net/goal/blog/195749?p=1 目录[-] 写在前面的话 什么是字节序 MSB和LSB 大端序 小端序 网络字节序 主机字节序 总结 pack/u ...
- [转]PHP: 深入pack/unpack
From : http://my.oschina.net/goal/blog/195749 http://www.w3school.com.cn/php/func_misc_pack.asp PHP作 ...
- PHP: 深入pack/unpack <转> [链接]
PHP: 深入pack/unpack PHP: chr和pack.unpack那些 PHP: pack/unpack补遗
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)
2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]
2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集. 上篇传送门: 2017年的golang.python.p ...
- golang与python多线程的并发速度
一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ...
- 想涨工资吗?那就学习Scala,Golang或Python吧
[编者按]据薪水调查机构 PayScale 提供的数据显示,掌握 Scala,Golang 和 Python 语言以及诸如 Apache Spark 之类的大数据技术,能带来最大的薪水提升.本文作者为 ...
随机推荐
- 类图(Rose) - Windows XP经典软件系列
版权声明:本文为xiaobin原创文章.未经博主同意不得转载. https://blog.csdn.net/xiaobin_HLJ80/article/details/24584625 ...
- EF Core中如何通过实体集合属性删除从表的数据
假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...
- Knowledge Point 20180303 对比编译器、解释器与Javac编译原理
编译器与Javac编译原理 在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言.那么什么是 ...
- UIPanGestureRecognizer 拖动TableView改变其高度
需求:项目中要求tableView的高度随着手拖动的位置而改变如下图: 关键代码如下: - (void)viewDidLoad{ panGestureRecognizer = [[UIPanGestu ...
- 用java数组模拟登录和注册功能
package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...
- 『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)
从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~ ...
- 如何优雅的使用C语言绘制一只小猪佩奇
今天我们来用C语言画一只小猪佩奇---社会.社会....在画小猪佩奇之前,我们先使用带符号的距离长 (signed distance field,SDF) 来画一个圆形. 使用这个方法表示形状,但是这 ...
- mac appstore应用下载失败,不能更新等等问题,都可以解决
打开终端,输入以下命令 open `getconf DARWIN_USER_CACHE_DIR`/com.apple.appstore 进入目录,删除 com.apple.appstore  重启系 ...
- Django忘记超级用户密码||账号
第一步:运行django shell python3 manage.py shell 第二步:重设密码 >>> from django.contrib.auth.models imp ...
- shell脚本实现目录的“5S”作业
shell,又称为命令解释器.首先它是一个软件,有很多个版本,现在最流行的为bash,它作为用户和内核沟通的中间桥梁,在系统中起着举足轻重的作用 shell脚本,是一个以.sh结尾的文件,里面是诸如l ...