最近解码了一个没有协议(.proto)文件的probuf包,遇到了以下的一些问题:

  1. 不清楚probuf的基础知识;
  2. 不清楚probuf的序列换和反序列化规则;
  3. 没有合适的调试工具;
  4. 不熟悉java里probuf流的操作;

解决了以上几个问题,问题也就迎刃而解了!

一、不清楚probuf的基础知识

官方定义:

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

主要了解到protobuf的基础定义,使用场景,一些规则,再结合一个实例这块就算解决了。

详细介绍可以在以下地方了解:

probuf详解:https://blog.csdn.net/weixin_42018112/article/details/89633837

深入 ProtoBuf - 简介:https://www.jianshu.com/p/a24c88c0526a

ProtoBuf结合java快速入门:https://www.jianshu.com/p/bb3ac7e5834e

二、不清楚probuf的序列换和反序列化规则

正常情况下我们需要协议文件,也就是生成probuf流时建立的 .proto文件,根据这个文件,我们可以解出来Message对应的每个字段的信息。官方给了一个命令,可以在无 .proto文件的情况下,解出probuf流的内容: protoc --decode_raw。

import subprocess
def decode(data):process = subprocess.Popen([r'D:\protobuf\protoc.exe', '--decode_raw'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)output = error = Nonetry:output, error = process.communicate(data)except OSError:passfinally:if process.poll() != 0:process.wait()return outputf = open(r"D:\testprotobuf.bin", "rb")
data = f.read()
print('data:/n',decode(data))

详细介绍可以在以下地方了解:

无protobuf协议情况下的反序列化------貌似无解, 其实有解!:https://blog.csdn.net/stpeace/article/details/53047424

protobuf流的反解析Message:https://blog.csdn.net/liujiayu2/article/details/77838761

三、没有合适的调试工具

了解完基础知识以后,我们就可以动手进行解码的尝试了。由于网上没有一些在线的工具(像beJSON)可以辅助我们判断自己的尝试是否正确,直接在代码里尝试,每一次修改,启动,都不太好确定是哪里出了问题,所以我们先在一些在线调试工具中确定了我们的probuf流是正确的,我们推导出的.proto文件也是正确的,再进行编码。

我们现有的protobuf流是一个16进制的流:

08 d0 02 10 c3 80 80 80 80 80 80 02 1a 0e 0a 0c e5 be ae e8 bd af e9 9b 85 e9 bb 91 22 4c 08 bd f3 0b 12 06 e8 8a ac e5 85 b0 1a 18 77 c9 35 5a 0e 0c 3b 40 1c d7 c2 bc c7 2b 50 40 00 00 00 00 00 00 2c 40 20 00 50 ff ff ff ff ff ff ff ff ff 01 59 00 00 00 00 00 00 3e 40 60 80 80 80 f8 0f 68 00 70 1e 78 ff ff ff ff 0f 22 4f 08 a1 f4 0b 12 09 e4 b9 8c e5 85 8b e5 85 b0 1a 18 02 37 db 85 e6 7a 40 40 b0 59 3c 87 32 80 48 40 57 b3 09 97 5c 3b 5f 40 20 00 50 ff ff ff ff ff ff ff ff ff 01 59 00 00 00 00 00 00 3e 40 60 80 80 80 f8 0f 68 00 70 1e 78 ff ff ff ff 0f

通过两个工具:Protobuf Decoder 和 Online Protobuf encoder/decoder,就可以很方便的确定我们的probuf流是否正确,我们推导出的.proto文件是否正确。Protobuf Decoder不需要协议文件(.proto)可以解析出我们的数据内容,Online Protobuf encoder/decoder可以判断我们推导出的协议文件是否正确。

上述工具资源地址:

无协议文件解码工具decode:https://download.csdn.net/download/qq_25073789/12334831

通过协议文件编码解码流工具: https://download.csdn.net/download/qq_25073789/12334839

四、不熟悉java里probuf流的操作

proto文件准备就绪,java代码也通过protoc命令生成后,我们读取16进制流文件对其进行反序列化。反序列化的接受格式为byte[],所有我们使用BufferedInputStream进行文件读取,以下代码为读取probuf流的方法。反序列化和生成java文件的方法参考教程。

public static byte[] readFile(File file) throws Exception {if (file.exists() && file.isFile()) {long fileLength = file.length();if (fileLength > 0L) {BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));byte[] b = new byte[(int) fileLength];fis.read(b);fis.close();fis = null;          return b;}} else {return null;}return null;
}

java代码参考:

java中使用ProtoBuf的Demo: https://www.cnblogs.com/jpfss/p/10881357.html

probuf 流无协议文件反序列化相关推荐

  1. java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...

    一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...

  2. Java19-day10【标准输入输出流、字节字符打印流、对象序列化-反序列化流、serialVersionUIDtransient、Properties】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

  3. Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)

    CVE-2020-1938 1.概述 1.1 tomcat概述 1.2 gostcat概述 - 漏洞概述 2. 漏洞成因 2.1 前置基础 2.1.1 Tomcat Connector(连接器) 2. ...

  4. Stream流、FiLe和IO流、IO流(字节流-拷贝文件_和_字符流-读取文本中的数据写入文本文件中)9-10-11

    package com.streamdemo; import java.util.ArrayList; import java.util.List; /*** 体验Stream流** 创建一个集合,存 ...

  5. 【计算机网络】2、TCP:四次挥手与TIME_WAIT、shutdown() 优雅关闭 server、探活、拥塞窗口与 Nagle 算法、端口占用、tcp 的流式协议、可靠性

    文章目录 六.四次挥手 与 TIME_WAIT 6.1 TIME_WAIT 的作用 6.2 TIME_WAIT 的危害和方案 七.server 用 shutdown() 优雅关闭 7.1 close( ...

  6. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)

    相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来实现呢?我并不否认"拿来主义",只是我个人 ...

  7. java输入a控制台打印1_Java—— 流(Stream)、文件(File)和IO

    参考于:https://blog.csdn.net/qq_22063697/article/details/52137369  版权声明:本文为博主原创文章,转载请附上博文链接! 一.  什么是 IO ...

  8. C#二进制流的序列化和反序列化操作

    C#项目中较多使用了序列化和反序列化,较为常用的序列化和反序列化操作有二进制流,JSON,XML等,现在介绍一下.net中二进制流的序列化和反序列化操作方法: 1.将对象序列化为二进制流: /// & ...

  9. Android—在WebView中下载Blob协议文件

    之前有个需求是要下载Blob协议的gif,让我苦恼了好久.平时下载http协议的文件时直接获取输入流即可,但是Java无法获得Blob协议的文件流,无法直接处理.不过JavaScript处理Blob协 ...

最新文章

  1. basePath = request.getScheme()+://+request.getServerName()+:+r
  2. Java 程序员排行前 10 的错误,你有没有中?
  3. 使用ueditor实现多图片上传案例
  4. myeclipse怎么导入mysql驱动_myeclipse sql导入数据库驱动包
  5. 令人难以置信的竞争性编程-您无需学习
  6. PostgreSQL数据库安装Version10.5
  7. zabbix_appliace 3.4安装部署
  8. 美国道富java开发面试题_从事Java开发五年,面试9家拿到7家offer,1096面试+67笔试题...
  9. 如何安装64位Windows7
  10. python调用hive与java调用区别_使用Pyhive调用
  11. Android Studio 下载ndk
  12. 基于ARMA模型的客流预测
  13. SpringBoot项目多环境配置(亲测有效)
  14. warcraft 3 经典语句之月之女祭司(Priestess of the moon)
  15. 用unity实现大转盘
  16. DataGrip连接hive建表时报cannot recognize input near ‘show‘ ‘indexes‘ ‘on‘ in ddl statement错误
  17. 我国目前大数据产业发展现状
  18. 【吴恩达深度学习】——NLP和Word Embedding
  19. 山东大学机器学习课程资源索引
  20. JMETER-性能测试

热门文章

  1. 通过关键字采集PDD商品列表
  2. Excel-VBA 快速上手(十一、字符串常用操作)
  3. 用好Clear功能 让你感官不疲劳——rzxt.com
  4. Spring:been的生命周期
  5. SAP PP相关函数
  6. ajax判断远程服务器是否存在某文件
  7. Hive连接Spark报错java.sql.SQLException: null, message from server: Host 'datanode03' is blocked becaus
  8. MES系统功能助力注塑行业降本增效
  9. FileUriExposedException: file:///storage/emulated/0/Android/data/com.skyrin.bingo/cache/app/app.apk
  10. 【牛客网】埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 题解