protobuf数据序列化后数据丢失(double数据变成0) 的bug引发的思考

2023-05-16

protobuf是Google开发的一个开源序列化框架,类似XML,JSON,其最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。但是,protobuf在使用当中也发现一些问题,数据在protobuf序列化后无法反序列化,这就与protobuf的目的违背。下面我们来看下这个问题吧。

发送过来的字节串

下面是我收到数据后解析出来的

printf("msg from MEC recved len: %d\n",payload_len);
    printf("----------udm share1-----------------\n");
    for(int i = 0;i < payload_len;i++)
    {
        printf("%d ",payloadptr[i]);
    }
    printf("\n");

 这两段数据负数与下面接收到的正数绝对值相加为256,也就是正数与负数互为补码。

所以消息收发,是没有问题的,但是解析出来的数小数部分全是0

首先定义一个protobuf结构,如下:

 

message Person {
  required int32 mid = 1;
  required int32 type = 2;
}
再来看下这段代码,看似没有问题:

Person psn0;
psn0.set_mid(1);
psn0.set_type(0);

string str0;
psn0.SerializeToString(&str0);

// 由于网络传输, string 需要转换成 char*
const char* buf = str0.c_str();

// 如果是这样解析,将会引起bug
string str1 = buf;

People psn1;
bool ret1 = psn1.ParseFromString(str1);

if (ret1)
{
	cout << "str1 parse success" << endl;
}
else
{
	cout << "str1 parse fail" << endl;
}

// 这样解析不会引起bug
string str2;
str2.assign(buf, str0.length());

People psn2;
bool ret2 = psn2.ParseFromString(str2);

if (ret2)
{
	cout << "str2 parse success" << endl;
}
else
{
	cout << "str2 parse fail" << endl;
}

运行结果,如下:

str1 parse fail
str2 parse success

这样就可以解析到正确的数据了。

这里解释一下原因:在以上例子中,protobuf 序列化的 string 数据里含有 ‘\0‘ 字符。如果以 char* 取protobuf序列化后的数据,将会丢失部分数据。

虽然这个严格意义来讲也不算protobuf的bug,但在protobuf的使用中一般很少人注意protobuf 的数据中带有 ‘\0‘ 字符,这就导致了bug的发生。

 

 

        //将消息转换成protobuf的字节流
        std::string str = msg_vin_up_.SerializeAsString(); 
        if(str.length() > 0) 
        {  
            len = str.length();
            char *msg_data = (char*)str.c_str();  //string类型转换成char*
        }

 


                        

 

参考:

http://blog.csdn.net/mycwq/article/details/19619875

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf数据序列化后数据丢失(double数据变成0) 的bug引发的思考 的相关文章

  • python 入门 第二讲 读取日志文件分析

    https www bilibili com video av77410524 p 61 29 计算传感器日志文件中温度数据的平均值 日志文件包含1万条数据温度数据在文件的第3列输入 xff1a 日志文件 sensor data txt输出
  • python 入门 第三讲 读取中文分析

    统计中文词语出现的次数 以政府一号文件为例 xff0c 统计出现的中文词语数量按照一定标准输出 xff0c 如出现次数等需要解决中文分词问题 xff0c 如 xff1a 这是一门好课 gt 这是 一门 好课 输入 xff1a 2018年一号
  • docker命令

    1 docker version docker version 显示 Docker 版本信息 docker version 例如 xff1a span class token comment docker version span Clie
  • python 入门 第四讲 基本数据类型

    python主要包括9中基本数据类型 数值类型 xff1a 整数 浮点数 复数字节类型 xff1a 字符串 字节串组合类型 xff1a 集合 元祖 列表 字典 为什么会出现不确定尾数 xff1f 计算机 不确定尾数问题来源于浮点数在计算机中
  • Linux - Shell - 在多个文件中查找关键字

    https www cnblogs com xy14 p 11735343 html 1 概述 在多个文件中 查找内容 2 想干啥 目的 在 多个文件 中 查找内容准备 之前在 单个文件里 查找过内容 工具 awk 前提 文件有固定格式查找
  • protobuf repeated数组类型的使用

    http www cppblog com API archive 2014 12 09 209070 aspx protobuf是Google开发的一个序列化框架 xff0c 类似XML xff0c JSON xff0c 基于二进制 xff
  • 分治法,迭代与动态规划及贪心算法感悟

    分治法 xff0c 动态规划法 xff0c 贪心算法这三者之间有类似之处 xff0c 比如都需要将问题划分为一个个子问题 xff0c 然后通过解决这些子问题来解决最终问题 但其实这三者之间的区别还是蛮大的 1 分治法 分治法 xff08 d
  • Python字符串操作大全

    Python中字符串的定义 xff1a 由Unicode码点组成的不可变序列 xff08 Strings are immutable sequences of Unicode code points xff09 Python内置函数提供了强
  • python 入门第五讲 分支与循环

    for i in range 1 15 print i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 从M开始 xff0c 到N结束 xff0c K为步长 for c in 34 hello 34 print c end
  • python 入门第六讲 异常处理

    1 异常的基本用法 2 异常的高级用法 ZeroDivisionError TypeError def foo a try b 43 61 100 a except ZeroDivisionError print 34 can not di
  • python 入门第1七讲 函数的定义与使用

    单元开篇 xff1a 函数定义和使用 1 函数的定义和调用 2 函数的参数传递 3 局部变量和全局变量 4 lambda函数 xff08 匿名函数 xff09 5 函数递归 函数相关的保留字 def 声明函数 return global x
  • python 入门第八讲 组合数据类型基础

    集合类型 xff1a 一组数据的集合 集合的特性 xff1a 无序 xff1a 元素间没有顺序 xff0c 因此要求元素不能相同 xff0c 元素必须是不可变类型 非一致 xff1a 元素类型可以不一样 无索引 xff1a 不能对某个元素进
  • python 入门第九讲 组合数据类型运算函数及方法(非常重要)

    目录 单元开篇 xff08 组合数据类型使用方法 xff09 我是美丽的分割线 我是美丽的分割线 单元开篇 xff08 组合数据类型使用方法 xff09 集合类型的使用 1 2 3 元祖类型的使用 xff08 xff09 列表类型的使用 字
  • ROS学习日志:话题的方式统一控制5台机器人

    在gazebo环境中搭建一个尽量美观的场景 启动5台 turtlebot3 机器人 xff0c 以话题的方式统一控制5台机器人的运动速度 xff08 1 xff09 原有文件基础上添加多个机器人 xff08 2 xff09 统一话题控制五个
  • Ubuntu20.04 ROS读取basler相机图像步骤。MATLAB2021b标定basler单目相机

    运行环境 xff1a Ubuntu20 04 xff08 64 Bit xff09 ROS版本 xff1a Noetic 网卡型号 xff1a Realtek RTL 8156外置网卡 相机型号 xff1a acA 1920 25gc xf
  • 人工智能该如何学习

    看了一个小视屏 xff0c 做的一个笔记 人工智能专业选择 兴趣驱动 xff0c 不要盲目跟风 xff01 1 需要数学基础 微积分 线性代数 概率论和数理统计 2 一门合适的语言 xff0c 推荐python 3 学习算法的几个层次 看懂
  • C++ 中的深拷贝与浅拷贝

    https www cnblogs com cxq0017 p 10617313 html
  • python 入门 第十讲 文本数据清洗及统计

    程序需求 xff1a 文本类信息清洗及统计的可能需求场景 从多个来源获得的格式不一的文本类型数据进行汇总及初步统计难点 xff1a 多个来源数据的清洗 格式化及归一化 相同内容去重等 大学MOOC之问 xff1a 在中国参与MOOC 建设的
  • python入门 第11讲 文件的操作及使用

    文件是数据的抽象和集合 文本方式和二进制方式是文件的两种不同展示方式文本方式采用统一的编码解释文件 xff0c 二进制方式采用字节解释文件Python语言的文件使用理念与其他语言一致 xff0c 如c语言 文件的打开 xff1a 文件路径
  • python入门 第12讲 一二维数据格式化

    数据组织的维度 xff1a 维度 xff1a 一组数据的组织形式 数据的维度 数据的操作周期 xff1a 一维数据的两种表示方式 xff1a 亿微数据的存储 xff08 哪种好 xff1f xff09 存储于表示之间的关系 xff1a 一维

随机推荐