写得不完善也不完美 尤其是高低位转换那(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的更多相关文章

  1. python struct中的pack unpack

    python struct中的pack unpack pytyon tuple元组 print struct.unpack("!ihb", buffer)  结果为7 //pyth ...

  2. PHP: 深入pack/unpack

    https://my.oschina.net/goal/blog/195749 PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性 ...

  3. PHP: 深入pack/unpack 字节序

    http://my.oschina.net/goal/blog/195749?p=1 目录[-] 写在前面的话 什么是字节序 MSB和LSB 大端序 小端序 网络字节序 主机字节序 总结 pack/u ...

  4. [转]PHP: 深入pack/unpack

    From : http://my.oschina.net/goal/blog/195749 http://www.w3school.com.cn/php/func_misc_pack.asp PHP作 ...

  5. PHP: 深入pack/unpack <转> [链接]

    PHP: 深入pack/unpack PHP: chr和pack.unpack那些 PHP: pack/unpack补遗

  6. 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时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...

  7. 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]

    2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集.   上篇传送门: 2017年的golang.python.p ...

  8. golang与python多线程的并发速度

    一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ...

  9. 想涨工资吗?那就学习Scala,Golang或Python吧

    [编者按]据薪水调查机构 PayScale 提供的数据显示,掌握 Scala,Golang 和 Python 语言以及诸如 Apache Spark 之类的大数据技术,能带来最大的薪水提升.本文作者为 ...

随机推荐

  1. 9.spring:事务管理(下):声明式事务管理

    声明式事务管理 sprin的声明式事务是管理AOP技术实现的事务管理,其本质是是对方法前后进行拦截,然后 在目标方法开始之前创建或者加入一个事务,在执行完成目标方法之后根据执行情况提交或者回滚事务. ...

  2. 理解JavaScript原始类型和引用类型

    原始类型 我们知道类型(type)定义为值的一个集合,所以每种原始类型定义了它包含的值的范围及其字面量表示形式.一共有5 种原始类型(primitive type),即 Undefined.Null. ...

  3. iPhone 耳机在PC电脑上使用方法

    把主声道(Master)从正中间调整到最左或者最右就行了

  4. 两种方式(xml+代码)构建SqlSessionFactory+完整实现

    首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...

  5. Python:文件的读取、创建、追加、删除、清空

    一.用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行:#python>>>f=open('f.txt','w')    # r只读,w可写,a追加>> ...

  6. windows搭建本地IIS服务器+php安装+移动设备内网访问服务器

    启动IIS服务 1. 打开 “控制面板” => "程序" => "启用或关闭Window功能": 2. 接着勾选相应设置: 3. 继续勾选对应目录下 ...

  7. 字符编码ascii、unicode、utf-­‐8、gbk 的关系

    ASIIC码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码.ASIIC码包括数字大小写字母和常用符号,一共 ...

  8. 面试题——Java虚拟机

    一.运行时数据区域 Java虚拟机在执行Java程序的时候会把它所管理的内存划分为若干个不同的数据区域,这些区域各有用途: 程序计数器:(线程私有的) 程序计数器是一块较小的内存,可以看作是当前线程所 ...

  9. CentOS7 LNMP+phpmyadmin环境搭建(一、虚拟机及centos7安装)

    前一阵子配公司的服务器的时候,发现网上好多教程杂乱无章,然后便根据网上已有资料自己整理了一个lnmp环境的安装教程.因为懒,已经好久没写过博客了.趁着这次公司招新人,把之前整理的文档又整理了一次,顺便 ...

  10. 微信小程序上滑加载更多

    onReachBottom: function () { var that = this var limit = that.data.limit var count = that.data.count ...