日更系列之如何快速排查protobuf数据格式

2022-03-01 00:12:54 浏览数 (1)

一、背景

之前和同事定义一个pb数据格式问题,他那边负责生产数据源,然后转pb再存到redis,然后我来消费这个pb,进行解开。这个过程不涉及到数据压缩如snappy。首先我消费线程代码写好了,来和他联调这份数据。但是我这边代码解析失败了。

消费者线程使用的是C 程序,对于c 解析pb格式的数据,无非就是两种api接口ParseFromString()和ParseFromArray。这两个接口对应于json的“{}”和“[]”格式,但是都失败了。

二、redis-cli工具查数据

那么我先使用排查是我消费者线程写的有问题。我使用了redis-cli工具,直接从数据库拿出来写到文件。

代码语言:javascript复制
redis-cli -h [域名] -p [端口] get [redis key] > /tmp/1650.pb

然后呢因为这个域名是redis集群的其中一个ip,所以有时候会取不到数据,第一次查询可能会重定向到真实数据的那台机器ip。

三、protobuf工具

然后我就取到了pb数据,然后怎么验证这个pb是否正确呢,我找到了两个工具。

第一个是简单验证是否是protobuf格式的工具。这个工具使用过程我感觉有点漏报,就是该是pb,可能会被误认为非pb格式。

第二个工具是更推荐,他会根据proto定义文件,然后从原始pb转成json,也支持json转成pb。

3.1 第一个是fq工具

他其实是用于识别二进制文件的工具,识别protobuf只是它的一部分功能。

fq读取二进制数据。结果是一个 JSON结构,其中每项都有二进制位范围、符号备注,并以直观的方式呈现。github仓库: https://github.com/wader/fq

检查1650.pb这个文件是不是合法的proto文件,这样用

代码语言:javascript复制
fq -d protobuf . 1650.pb

3.2 pb和json互转的简易命令行工具

第二个工具,是我在github找的一个用c 写的,pb和json互转的简易命令行工具

github仓库是这个https://github.com/hq6/ProtobufJson.git

编译完使用命令,就可以类似这样使用。

他这个仓库,我修改了Makefile才能编译成功,一个是加上-pthread,另一个是加上protobuf的头文件include路径和lib路径。

0 人点赞