乐趣区

关于protobuf:php-使用-protobuf

本文承接上文,带来去 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 的解析函数外面即可进行正确的读写 
退出移动版