本文承接上文,带来去protobuf的应用过程

背景:跟公司C++大佬应用protobuf协定进行通信

在跟大佬沟通过程中遇到的最大的问题是相互之间不理解数据格式等纳闷,在这里也是遍及下数据的一个传输过程和字节流等内容,讲的有些零零碎碎,还请包涵

举个例子来说下一个数据格式的问题,在C++中一个整型数据可能是有符号长整型,无符号长整型。在此之外,数据还分16位和32位的区别。

咱们晓得,一个字节占8位,绝对于二进制来说,就是多少位是几个字节

上面进入正题说下protobuf的相干问题

protobuf分为三局部,第一局部是音讯内容长度(head),第二局部是音讯内容类型(type),第三局部是音讯体(body)

因为protobuf传入过去的是二进制的包,所以在php外面须要应用pack(),unpack()这两个函数进行解包,再将数据传到protobuf的解包函数中

举个例子说:

A向B发了一个protobuf包,A定义的这个包的第一局部(head)也就是音讯体(body)的长度是4字节也就是32位的有符号长整型,第二局部(type)是2字节也就是16位的有符号短整型,而后第三局部是音讯体(body)那对于php来讲,就须要先对这个包进行解析,也就是解包在php外面,对于加包/解包而言,就是应用pack(),unpack()这两个函数unpack($format,$args)有两个参数,第一个参数是解包的参数,第二个参数是二进制字节流这里参考了这个大佬的文章对二进制包进行了相干格局的解析,具体对于这两个函数的应用移步大佬https://segmentfault.com/a/1190000008305573依照下面的例子就是应用unpack()进行解包,第一个4字节32位的有符号长整型对应到unpack的参数外面是I,即unpack('Ihead',$str)我这里在I前面定义了一个head来承受解析进去的值,在PHP外面打印进去的是一个数组[    'head'  => xxxx,]第二个2字节也就是16位的有符号短整型对应到unpack的参数外面是s,即unpack('Ihead/stype',$str)在这里打印进去的值是[    'head'  => xxxx,    'type'  => xxxx,]因为咱们获得是第二个2字节外面的值,所以必须把第一个4字节也带上,或者能够应用substr()把两头的2字节进来来应用unpack也行第三局部的值应用substr取出来即可,因为后面的是6字节的head和type,所以第三局部的body就能够间接应用substr()取出即可substr(6,str)接下来将取出来的值放入protobuf的解析函数外面即可进行正确的读写