在计算机中,负数会被表示为很大的整数,因为计算机定义负数符号位为数字的最高位,所以如果采用varint编码表示一个负数,那么一定需要5个比特位。所以在protobuf中通过sint32/sint64类型来表示负数,负数的处理形式是先采用zigzag编码(把符号数转化为无符号数),在采用
varint编码。

sint32:(n << 1) ^ (n >> 31)

sint64:(n << 1) ^ (n >> 63)

比如存储一个(-300)的值

-300

原码:0001 0010 1100

取反:1110 1101 0011

加1 :1110 1101 0100

n<<1: 整体左移一位,右边补0 -> 1101 1010 1000

n>>31: 整体右移31位,左边补1 -> 1111 1111 1111

n<<1 ^ n >>31

1101 1010 1000 ^ 1111 1111 1111 = 0010 0101 0111

十进制: 0010 0101 0111 = 599

varint算法: 从右往做,选取7位,高位补1/0(取决于字节数)

得到两个字节

1101 0111 0000 0100

-41 、 4

Protobuf序列化的原理-负数的存储相关推荐

  1. Protobuf序列化的原理

    我们可以把序列化以后的数据打印出来看看结果 public static void main(String[] args) { UserProtos.User user = UserProtos.Use ...

  2. Protobuf序列化的原理-总结

    Protocol Buffer的性能好,主要体现在 序列化后的数据体积小 & 序列化速度快,最终使得传输效率高,其原因如下: 序列化速度快的原因: a. 编码 / 解码 方式简单(只需要简单的 ...

  3. Protobuf序列化的原理-存储格式

    protobuf采用T-L-V作为存储方式 tag的计算方式是 field_number(当前字段的编号) << 3 | wire_type 比如Mic的字段编号是1 ,类型wire_ty ...

  4. Protobuf序列化的原理-protobuf的基本应用

    使用protobuf开发的一般步骤是 1. 配置开发环境,安装protocol compiler代码编译器 2. 编写.proto文件,定义序列化对象的数据结构 3. 基于编写的.proto文件,使用 ...

  5. Protobuf序列化的原理-字符如何转化为编码

    "Mic"这个字符,需要根据ASCII对照表转化为数字. M =77.i=105.c=99 所以结果为 77 105 99 大家肯定有个疑问,这里的结果为什么直接就是ASCII编码 ...

  6. Protobuf序列化的原理-varint

    先说第一种,我们先来看age=300这个数字是如何被压缩的 这两个字节字节分别的结果是:-84 .2 -84怎么计算来的呢? 我们知道在二进制中表示负数的方法,高位设置为1, 并且是对应数字的二进制取 ...

  7. Protobuf序列化原理

    一.Protobuf序列化原理简介 1.1序列化 序列化是将数据结构或对象转换成二进制字节流的过程. Protobuf对于不同的字段类型采用不同的编码方式和数据存储方式对消息字段进行序列化,以确保得到 ...

  8. Android Protobuf应用及原理

    前言 之前一直忙于移动端日志SDK Trojan的开源工作,已十分稳定地运行在饿了么团队App中,集成了日志加密和解密功能.哎呀,允许我卖个狗皮膏药,不用不知道,用了就知道,从此爱不释手,Trojan ...

  9. 【转】Android Protobuf应用及原理

    前言 之前一直忙于移动端日志SDK Trojan的开源工作,已十分稳定地运行在饿了么团队App中,集成了日志加密和解密功能.哎呀,允许我卖个狗皮膏药,不用不知道,用了就知道,从此爱不释手,Trojan ...

最新文章

  1. 运行管理员线程和用户线程小练习
  2. 图论 —— 图的连通性 —— 并查集判断连通性
  3. 直播App测试重点问题 - 服务器压力
  4. 文本分类器,可自由加载BERT、Bert-wwm、Roberta、ALBert以及ERNIE1.0
  5. jumserver 官方文档和
  6. 05Oracle P6培训系列:05创建项目
  7. 绿盾加密导致Visual Stdio无法使用
  8. 一文解读KANO模型
  9. 解读机器人编程入门指南
  10. 2021-2027中国家具拉手市场现状及未来发展趋势
  11. S7–1500遇上工业无线AP:一个立体仓库无线网络故障诊断分析案例
  12. 【泛函分析】 1 距离空间
  13. Linux知识点概要之课堂总结
  14. 这三年,一路走来,劈荆斩棘 – Vol 2
  15. SSH整合,非常详细的SSH整合
  16. 前端开发:JS获取当前日期方法
  17. STM32F103ZET6驱动57闭环步进电机(连线+代码)
  18. python自助电影售票机_2019-03-20_面向对象_模拟电影院自动售票机选票[Python练习题]...
  19. 低代码指南100解决方案:49应用参谋让家校互联更透明,让家长心甘情愿成为教培机构宣传“水军“
  20. 云更新服务器系统教程,云更新服务器端教程

热门文章

  1. datasnap 2011连接池,数据集对象池
  2. 关于C语言的一些小知识点
  3. flex与flash的交互
  4. gridcontrol 控件的用法
  5. 【UOJ 276】无向图最小环
  6. jQuery 库 - 特性
  7. javascript 基础下
  8. 再谈 Java中Runnable和Thread的区别
  9. Android注册会员系统返回上一步时如何保存信息
  10. 工信部IC power大讲堂(南京)开班,特邀国际名家做核心技术分享