python pack unpack_golang 仿python pack/unpack

package includes

import ("bytes"

"encoding/binary"

"fmt"_"os"

"strconv"

"strings")

type Protocolstruct{

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))...)

}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)))))...)

}

}

}returnret

}//解包

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)]

}else if p.Format[i] == "I"{

ret[i]= Bytes4ToInt(msg[0:4])

msg= msg[4:len(msg)]

}else if 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)]

}

}

}returnret

}

func (p*Protocol) Size() int{

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

size= size + 2}else if p.Format[i] == "I"{

size= size + 4}else if strings.Contains(p.Format[i], "s") {

num, _ := strconv.Atoi(strings.TrimRight(p.Format[i], "s"))

size= size +num

}

}

}returnsize

}//整形转换成字节

func IntToBytes(n int) []byte{

m :=int32(n)

bytesBuffer := bytes.NewBuffer([]byte{})

binary.Write(bytesBuffer, binary.BigEndian, m)

gbyte :=bytesBuffer.Bytes()returngbyte

}//整形转换成字节4位

func IntToBytes4(n int) []byte{

m :=int32(n)

bytesBuffer := bytes.NewBuffer([]byte{})

binary.Write(bytesBuffer, binary.BigEndian, m)

gbyte :=bytesBuffer.Bytes()//c++ 高低位转换

k := 4x :=len(gbyte)

nb := make([]byte, k)for i := 0; i < k; i++{

nb[i]= gbyte[x-i-1]

}returnnb

}//整形转换成字节2位

func IntToBytes2(n int) []byte{

m :=int32(n)

bytesBuffer := bytes.NewBuffer([]byte{})

binary.Write(bytesBuffer, binary.BigEndian, m)

gbyte :=bytesBuffer.Bytes()//c++ 高低位转换

k := 2x :=len(gbyte)

nb := make([]byte, k)for i := 0; i < k; i++{

nb[i]= gbyte[x-i-1]

}returnnb

}//字节转换成整形

func BytesToInt(b []byte) int{

bytesBuffer :=bytes.NewBuffer(b)varx 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[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)varx int32

binary.Read(bytesBuffer, binary.BigEndian,&x)return int(x)

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript递归应用与实践

递归简单来说就是函数内调用自生的一种方法&#xff0c;形如&#xff1a; function foo(){foo() } 复制代码下面我列举一些常用的递归应用。 1. 求和&#xff0c;例如求1234...100之和 分析如下&#xff1a; sum(100)sum(99)100 sum(99)sum(98)99 ... sum(1)sum(0)1 复制代码代…

一个好的设计师_是什么让一个好的设计师

一个好的设计师重点 (Top highlight)The design manager role has grown considerably over the past five years. As design has been recognised as a business value-driver and organisations have increased their design maturity, we’ve seen lots more design managem…

PHP-Redis扩展安装 error: ext/standard/php_smart_str.h: No such file or directory

在源码编译PHP-redis扩展时&#xff0c;遇到缺少头文件问题【问题描述】error: ext/standard/php_smart_str.h: No such file or directory 【问题原因】PHP安装好的头文件目录&#xff1a;/php/include/php/ext/standard/&#xff0c;这些头文件&#xff0c;在php7之前的版本&…

相见恨晚的一款前端布局神器!

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天给大家推荐一款非常实用的前端页面布局神器&#xff0c;点击下方卡片关注我&#xff0c;或者查看源码系列文章。页面和布局是一门前端程序员的必修课&#xff0c;css 从来也不是停留在面试八…

IC设计前端几本经典书籍

No.1 Writing Testbenches, Functional Verification of HDL Modelsby Janick Bergeron本书主要以HDL&#xff08;verilog/vhdl&#xff09;为例&#xff0c;详细讲述了在IC DESIGN FLOW中Verification 以及Test的设计思想、方法和技巧&#xff0c;涵概了测试的各个方面&#x…

unreal无损音乐百度云_将网易云音乐专用的无损音乐格式转换成全平台通用的无损格式...

前几天发现网易云音乐的ncm格式很坑爹&#xff0c;由于网易云的部分音乐采取了这种流媒体平台模式&#xff0c;这种格式的歌曲下载到设备本地以后只有在网易云音乐的app上面才能播放&#xff0c;而且还要在会员生效期间才能播今天网易云弄出一个ncm&#xff0c;明天百度音乐来一…

锁升级

JavaSE1.6为了减少获得锁和释放锁带来的性能消耗&#xff0c;引入了“偏向锁”和“轻量级锁”。 在JavaSE1.6中&#xff0c;锁一共有4种状态&#xff0c;级别从低到高依次是&#xff1a;无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态&#xff0c;这几个状态会随着竞争情况…

ux和ui_首先要做的— UX / UI案例研究

ux和ui休息一下&#xff01; (Get some rest!) After four weeks of four-day design sprints each week, I welcomed the opportunity to work on this 9-day design challenge. With this also being an individual project, I allocated 50% of my time on the UX process a…

微信消息模板换行符转义问题处理

通常的微信模板&#xff1a; Hello &#xff01;\n\n Are you OK&#xff1f; ① 直接定义字符串&#xff1b; ② 数据库中读取&#xff1b;这里需要说明的是 数据库读取 的内容&#xff0c;如果直接推送&#xff0c;\n\n是没有被转移为换行符的。此时需要&#xff1a; $tplStr…

Vue2 彻底从 Flow 重构为 TypeScript,焕然一新!

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天分享一篇技术热点&#xff0c;众所周知&#xff0c;前不久vue3不打算支持IE11&#xff0c;vue2将支持composition API&#xff0c;现在vue2用ts重构&#xff0c;试问&#xff1a;还学得动嘛…

红米note5linux刷机包__最新最全的红米Note5ROM刷机包下载、刷机教程_红米Note5论坛_移动叔叔...

本帖最后由 压力山大大叔 于 2018-5-15 00:52 编辑20180513跟新全屏手势。看最后一张载图。1&#xff1a;先解锁&#xff0c;刷第三方&#xff0c;都是这个流程。2非常干净&#xff0c;只有670兆&#xff0c;刷完没有找到浏览器&#xff0c;刷前下载一个浏览器在手机里备用。3电…

每个网页设计者都自以为是

&#xff08;一&#xff09;垃圾还是经典网页技术更新很快&#xff0c;一个网站的界面设计寿命仅仅2-3年而已。不管是垃圾还是精品&#xff0c;都没有所谓的经典。经典只存在于是哪个首次成功创新性的应用。网页设计 者不管自己的学识、技术和经验如何&#xff0c;都自以为自己…

文件夹的拷贝

文件夹用来把文件包裹起来&#xff0c;褪去这些外衣&#xff0c;说到底拷贝文件夹也就是拷贝文件 模拟实例&#xff1a;将F:/Picture/test 文件夹 拷贝到 F:/Picture/dir文件夹 该实例中test文件夹下只包含了test.txt文件 步骤分析&#xff1a; 1.通过路径得到File对象 2.递归查…

【抽奖】若川诚邀你加前端群,长期交流学习~

最近有许多读者朋友关注了我&#xff0c;加我好友没有来得及拉群交流。另外偷偷告诉你&#xff1a;公众号回复 411&#xff0c;参与抽奖&#xff0c;送极客时间100元以内的课程&#xff0c;今晚八点开奖&#xff0c;必须开奖前加了我的微信&&像是前端&&关注了我…

帝国cms重置管理员_重新设计《纽约时报》 CMS飞行员

帝国cms重置管理员1.什么是飞行员&#xff1f; (1. What Is Pilot?) For 10 weeks, I joined The New York Times’s Story Formats team as a Product Design Intern. Partnered with technology intern Shormie Faruque, we were tasked with redesigning Pilot.大约十个星期…

微信小程序开发 Request Headers: Provisional headers are shown

在微信小程序开发的时候&#xff0c;写了两个API请求&#xff1a; 请求A://请求Awx.request({url: https://wx.baidu.com/api/wx/getBallByDate,method: POST,dataType: json,data: {date: that.data.curDate},header: {content-type: application/json},success: function(dt…

昆山万象汇机器人_昆山十镇,在售新盘汇总

陆家建伟国际汽车城&#xff0c;均价 7500 元/㎡美吉特家居广场&#xff0c;均价 17000 元/㎡美吉特灯都&#xff0c;均价 17000 元/㎡花桥绿地象屿苏河公园&#xff0c;均价 22950 元/㎡凯德都会新峰&#xff0c;均价 21500 元/㎡越洋国际&#xff0c;均价 18000 元/㎡浦西玫瑰…

Mini 容器学习笔记6——组件的获取(应用)

1. 通过组件Id获取组件实例&#xff1a; [Test]public void GetByIdTest(){ServiceRegistry.Register<Person>("person");var person ServiceLocator.Get<IPerson>("person");Assert.IsTrue(person ! null);var person2 ServiceLocator.Get&…

JavaScript ES2021 最值得期待的 5 个新特性解析

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天分享一篇关于ES2021的5个新特性。点击下方卡片关注我&#xff0c;或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列在写本文时&#xff0c;本文提到的新的 JavaScript …

uniapp延迟执行_uniapp微信小程序真机调试点击按钮有1秒延迟

详细问题描述(DCloud产品不会有明显的bug&#xff0c;所以你遇到的问题大都是在特定环境下才能重现的问题&#xff0c;请仔细描述你的环境和重现方式&#xff0c;否则DCloud很难排查解决你的问题)[内容]开发uniapp小程序项目时,在页面中点击按钮后, 数据即时更新, 视图层延迟1秒…