本篇继续上面的内容,带来使用protobuf的过程。背景:使用protobuf协议与公司C++老大交流。和大佬沟通遇到的最大的问题就是不理解对方的数据格式等疑惑,这里还有一个数据和字节流等的传输过程,有点零碎,还望大家多多包涵举个下一个数据格式问题的例子,C++Data中的整数可能是signedlong,unsignedlong。另外,数据也分为16位和32位的区别。我们知道一个字节占8位。与二进制相比,也就是多少位等于几个字节。下面进入正题,说说protobuf相关的问题。Protobuf分为三个部分。第一部分是消息内容的长度(head),第二部分是消息内容类型(type),第三部分是消息体(body)。因为protobuf是以二进制包的方式传入的,所以在PHP中需要使用pack()和unpack()函数来解包,然后把数据传给protobuf的解包函数。例如:A向B发送一个protobuf数据包,A定义的数据包的第一部分(head),即消息体(body)的长度为4字节,即一个32位的signedlonginteger,第二部分(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取出来,因为前面是head和type的6个字节,所以body的第三部分可以直接用substr()substr(6,str)取出,然后把取出来的值放到Analysis函数中protobuf的正确读写
