无protobuf协议情况下的反序列化------貌似无解, 其实有解!
来源:互联网 发布:家居网络互动平台 编辑:程序博客网 时间:2024/05/17 08:01
用过protobuf的人都知道, protobuf的序列化过程是:
协议文件(.proto) + 原始数据 ====》 buffer
反序列化的过程是:
buffer + 协议文件(.proto) ===>原始数据
那有没有办法实现: buffer ===》原始数据 呢? 这是一个貌似无解的问题, 其实有解。
如果在无协议的情况下, 能实现buffer到原始数据的转化, 那就具有非常重要的意义: 抓包后(抓16进制), 可直接转换成原始数据!!! Oh, my god, 效率呈现指数级提升!!! 着实让人兴奋
之前我学过h.264视频压缩, 原始的yuv数据经过h.264压缩后, 生成压缩视频, 每个字节都有其固定含义, 因此可解码。 类似地, 在protobuf序列化过程中, 也有这样的道理。 序列化后的每个字节都有固定含义, 那么自然就可以对这些有固定意义的字节进行解码, 我们来看看代码:
test.proto内容:
package NS; message PointReq { required int32 x=1; required int32 y=2; }taoge@localhost Desktop>
main.cpp内容:
#include <iostream>#include <string>using namespace std;#include "test.pb.h"using namespace NS;// 16进制string bufToHexStr(const char *pBuf, int bufLen){ if(NULL == pBuf || bufLen < 0) { return ""; } int i = 0; string sRet = ""; for(i = 0; i < bufLen; i++) { char szTmp[3] = {0}; snprintf(szTmp, sizeof(szTmp), "%02x", (unsigned char)pBuf[i]); sRet += szTmp; } return sRet;}int main(){ PointReq point; point.set_x(10); point.set_y(20); string tmp; bool ret = point.SerializeToString(&tmp); // 这里要传地址 if (ret) { printf("encode ok!\n"); } else { printf("encode error!\n");return -1; } cout << bufToHexStr(tmp.c_str(), tmp.size()) << endl; PointReq point2; ret = point2.ParseFromString(tmp); if (ret) { printf("decode ok, %d, %d\n", point2.x(), point2.y()); } else { printf("decode error!\n");return -2; } return 0;}
结果:
taoge@localhost Desktop> make g++ -c -L/usr/local/lib -lprotobuf -o main.o main.cpp g++ -c -L/usr/local/lib -lprotobuf -o test.pb.o test.pb.cc g++: -lprotobuf: linker input file unused because linking not doneg++: -lprotobuf: linker input file unused because linking not doneg++ -L/usr/local/lib -lprotobuf -o main main.o test.pb.o taoge@localhost Desktop> ./main encode ok!080a1014decode ok, 10, 20
上面反序列化依赖于test.proto协议文件。
下面, 我们不依赖于test.proto协议文件(仅仅利用序列化的结果080a1014)来反序列化一下:
如果协议是嵌套的, 那么此处的展示结果也是嵌套的, 有缩进关系, 非常好看, 爽心悦目
这个无协议序反序列化工具是某哥开发的, 所以我就不贴源码了。 无协议反序列化真的很有创意我们工作中, 每个人每天都有多次使用。
当然, 在你的公司, 很可能不用protobuf, 而是用自己公司开发的序列化协议框架, 那也一样, 无协议时可反序列化。有兴趣的朋友可以试着写一下无协议时的反序列化代码(一个字节一个字节地抠), 代码量其实很少!
- 无protobuf协议情况下的反序列化------貌似无解, 其实有解!
- 无协议情况下的反序列化
- MySQL在有索引列情况下 和 无索引情况下 select *的输出结果顺序
- 无标题,无语,其实还是有语的
- protobuf 的序列化与反序列化
- protobuf的序列化与反序列化
- 【Protocol Buffer】Protobuf的序列化和反序列化
- ProtoBuf的序列化和反序列化
- Mac OSX 无共享的密钥情况下连接基于L2TP协议的VPN
- Mac OSX 无共享的密钥情况下连接基于L2TP协议的VPN
- Mac OSX 无共享的密钥情况下连接基于L2TP协议的VPN
- Mac OSX 无共享的密钥情况下连接基于L2TP协议的VPN
- protobuf 序列化 反序列接口
- 树莓派3在无屏幕无路由器无串口情况下的使用
- 有解还是无解
- fmincon函数求解过程中出现无解的情况
- 很实用,想在不插网线的情况下,让网络连接不打叉?想在无连接的情况下不禁用TCP/IP协议?
- 当用new创建对象时(无继承和有继承两种情况下)虚拟机的执行过程
- hitcon2016 misc writeup
- c语言数据结构
- HDU 5969 最大的位或(不知道错哪了…求大神看看)
- 菜鸟之路——Spring MVC(二)再次深入
- Android学习8
- 无protobuf协议情况下的反序列化------貌似无解, 其实有解!
- 数据结构(五)---栈的链式存储的实现---java版
- 为大家介绍销售流程管理改革的好书《企业再造》
- JDK常用类
- 内存虚拟地址空间的划分空间
- ViewPager卡顿优化实战
- C# 数组和泛型的区别与泛型多了构造函数
- 28335的启动步骤介绍
- ajax同步与异步的区别