当前位置: 首页 > news >正文

广州微信网站建设市场新冠不易感染三种人

广州微信网站建设市场,新冠不易感染三种人,汕头网站建设详细内容,wordpress 下载 主题binary包使用与详解 最近在看一个第三方包的库源码,bigcache,发现其中用到了binary 里面的函数,所以准备研究一下。 可以看到binary 包位于encoding/binary,也就是表示这个包的作用是编辑码作用的,看到文档给出的解释…

binary包使用与详解

最近在看一个第三方包的库源码,bigcache,发现其中用到了binary 里面的函数,所以准备研究一下。
可以看到binary 包位于encoding/binary,也就是表示这个包的作用是编辑码作用的,看到文档给出的解释是
用于数字和字节序的转换以及变长值的编解码。

Uvarint

从buf解码一个uint64,返回该数字和读取的字节长度,如果发生了错误,该数字为0而读取长度n返回值的意思是:

n == 0 buf 太小了,没读到
n < 0 值太大了,64 bit 装不下,-n 为可以读到的字节数

看以下这个函数,我们不论这个函数是干啥的,我们只用关注

blockSize, n := binary.Uvarint(q.array[index:])
return q.array[index+n : index+int(blockSize)], int(blockSize), nil
从array 中index 的位置之后解析一个unit64, blockSize 为这个值,n 表示读到的字节数
什么意思呢?
比方说我设置了一个package 的一个大小,500byte,我把这个500这个数字编码到byte buf中,这个时候我们通过binary.Uvarint 这个解码出来的有两个值,按照这个方法,blockSize 这个就是500,n 表示编码这个500 占的字节数
那么通过这个peek 方法,实际上我们返回的值就是,从array这个byte buf中取从index+这个编码 之后到packeage的大小字符。说白了就是packege的数据。

// peek returns the data from index and the number of bytes to encode the length of the data in uvarint format
func (q *BytesQueue) peek(index int) ([]byte, int, error) {err := q.peekCheckErr(index)if err != nil {return nil, 0, err}blockSize, n := binary.Uvarint(q.array[index:])return q.array[index+n : index+int(blockSize)], int(blockSize), nil
}

PutUvarint

同样的,我们看下面的函数,我们不用考虑这个函数具体作用,只用分析

headerEntrySize := binary.PutUvarint(q.headerBuffer, uint64(len))
PutUvarint 编码,将什么编码呢,将这个uint64的长度这个数字进行编码,最终放在了q.headerBuffer这个[]byte中,返回的headerEntrySize 这值是什么呢,这个值就是编码用了多少字节。

func (q *BytesQueue) push(data []byte, len int) {headerEntrySize := binary.PutUvarint(q.headerBuffer, uint64(len))q.copy(q.headerBuffer, headerEntrySize)q.copy(data, len-headerEntrySize)if q.tail > q.head {q.rightMargin = q.tail}if q.tail == q.head {q.full = true}q.count++
}

PutUint64

同样的,我们不去管这个函数做了什么(实际上也很好理解),我们具体看

binary.LittleEndian.PutUint64(blob, timestamp)
binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash)
binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength))
事实上这个就是把timestamp hash keyLength的长度,这三个数字,给他放到blob 这个[]byte中,很明显这三个占了18字节

func wrapEntry(timestamp uint64, hash uint64, key string, entry []byte, buffer *[]byte) []byte {keyLength := len(key)blobLength := len(entry) + headersSizeInBytes + keyLengthif blobLength > len(*buffer) {*buffer = make([]byte, blobLength)}blob := *bufferbinary.LittleEndian.PutUint64(blob, timestamp)binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash)binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength))copy(blob[headersSizeInBytes:], key)copy(blob[headersSizeInBytes+keyLength:], entry)return blob[:blobLength]
}

Uint64

同样的,我们选择其中一个readEntry 的函数看看,是如何解码的,很简单

length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:])
length就是我们前面设置的key 的长度

func readEntry(data []byte) []byte {length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:])// copy on readdst := make([]byte, len(data)-int(headersSizeInBytes+length))copy(dst, data[headersSizeInBytes+length:])return dst
}

封装一个[]byte

考虑一下,我们的网络通信过程中,假设我们需要进行封包的操作。
在这里插入图片描述
假设我么利用上述的方法,对自己的协议进行自定义。
我们看看应用如何实现

func TestCmd(t *testing.T) {b := "hello"bb := []byte(b)encodeB := encode(ICmd{id: 1,cmd: 2,pLen: 5,message: bb})fmt.Println(string(encodeB))icmd := decode(encodeB)fmt.Println(icmd.id)fmt.Println(icmd.cmd)fmt.Println(icmd.pLen)fmt.Println(string(icmd.message))
}
type ICmd struct {id uint32cmd uint32pLen uint32message []byte
}
//然后我们在进行encode 和 decode 操作
const (idFixSize = 4cmdFixSize = 4pLenFixSize = 4SumIdCmdPLenSize = idFixSize+cmdFixSize+pLenFixSize
)
func encode(icmd ICmd) []byte {newBuf := make([]byte,len(icmd.message)+SumIdCmdPLenSize)binary.LittleEndian.PutUint32(newBuf,icmd.id)binary.LittleEndian.PutUint32(newBuf[cmdFixSize:],icmd.cmd)binary.LittleEndian.PutUint32(newBuf[idFixSize+cmdFixSize:],icmd.pLen)copy(newBuf[SumIdCmdPLenSize:],icmd.message)return newBuf
}func decode(data []byte) ICmd{icmd := ICmd{}icmd.id = binary.LittleEndian.Uint32(data[:idFixSize])icmd.cmd = binary.LittleEndian.Uint32(data[idFixSize:idFixSize+cmdFixSize])icmd.pLen = binary.LittleEndian.Uint32(data[idFixSize+cmdFixSize:SumIdCmdPLenSize])icmd.message = data[SumIdCmdPLenSize:]return icmd
}

在这里插入图片描述

http://www.ritt.cn/news/21257.html

相关文章:

  • 深圳展览设计网站建设上海专业seo公司
  • wordpress电影站免费b站推广网站在线
  • 无锡装饰网站建设排名排行榜网站
  • 答辩的时间_老师问了我做的网站可以同时支持的并发用户是多少外贸营销网站制作公司
  • wordpress大主题网站seo优化怎么做
  • 盐城网站优化湖南靠谱关键词优化
  • 网站做弹窗广告吗北京中文seo
  • 东莞的网站建设公司哪家好网站seo优化案例
  • wordpress源码站整站源码怎么在网上推广广告
  • 个人网站建设方案书 备案佛山全市核酸检测
  • 长春网站建设加q479185700百度seo公司整站优化
  • 邢台建站google搜索引擎官网
  • 建材做网站好吗软件培训机构哪家好
  • 网站建设宣传ppt模板cms系统
  • 做网站顺序买卖平台
  • 东莞房价还会涨吗手机优化器
  • 贵州网站建设kuhugz最近三天的新闻大事国内
  • 新开传奇网站曾劲松网站怎么打开
  • 怎么做网站导航栏人工智能培训机构排名
  • 赛盈分销平台官网seo推广计划
  • 商业网站设计制作公司搜多多搜索引擎入口
  • 做服装要看国外哪些网站客源引流推广
  • 珠海网站设计哪家好谷歌chrome安卓版
  • 永久免费自助建网站友情链接购买
  • 做a动态网站如何进行搜索引擎优化
  • 营销网站的建设与管理包括哪些事项中国目前最好的搜索引擎
  • 自己做网站制作需要多少钱新闻发稿发布平台
  • 福州公司做网站seo和sem是什么意思啊
  • 鱼台做网站多少钱今日新闻头条10条
  • 网站建设负责传资料不nba排名2021最新排名