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

网站正在建设中模板下载建设网站怎么输入分子式

网站正在建设中模板下载,建设网站怎么输入分子式,音乐制作专业留学,wordpress支持php7binary包使用与详解 最近在看一个第三方包的库源码,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.yayakq.cn/news/921734/

相关文章:

  • 好的网站模板wordpress 网站排名优化
  • 图案设计网站推荐北京网站建设电扬科技
  • 优化推广网站排名与wordpress类似的都有哪些
  • 做网站怎么导入地图北京seo收费
  • 南宁网站排名优化公司上海装修公司做网站
  • 如何做网站链接分享朋友圈网站是什么样子的
  • 网页ui设计的排版沈阳网络优化培训
  • 怎么做网站的浏览量统计网站设计模板之家
  • 百度搜索名字排名优化网站建设品牌推广seo
  • 做网站公司经营范围租用阿里云做网站
  • 怎么设置网站默认首页什么专业可以做网站编辑
  • 南京网络科技网站建设wordpress 分类名称
  • 学校网站建设信息做网站后台主要负责什么
  • 一流高职院校建设专题网站企业网站后台模板
  • 网站基本配置wordpress访客发布审核
  • 免费发布网站如何创做网站
  • 做暧视频网站大全在线网站建设机构
  • 外贸网络网站优化设计的基础是网站基本要素及每个细节的优化
  • 盗版网站怎么做的如何制作app平台
  • 建设行业门户网站需要什么条件php网站制作过程中遇到的问题及解决办法
  • 接单做一个网站多少钱济南seo顾问
  • 怎么创建网站自己创建石家庄网站开发公司
  • 找别人做网站需要什么信息网站突然消失了
  • 全总基层组织建设网站林和西网站建设
  • 做qq空间动态皮肤网站服务器上的网站怎么做301
  • 国家优质校建设网站电子商务网站实例
  • 给人做设计的网站wordpress 调取侧边栏
  • 河北建设工程信息网站广州网站建设咨询电话
  • 制作网站的设计难点葫芦岛建设工程信息网站
  • 旅游网站规划方案视觉中国官网