varint原理 - 负数的编码和解码
前一篇博客 varint原理 - 正数的编码和解码_YZF_Kevin的博客-CSDN博客我们讲了varint的实现原理,举例也分析对于正数的编码,解码过程
本篇博客,我们开始举例分析负数的编码和解码,因为负数有原码,反码,补码的概念,如果大家对这一块不熟,可以先看下我的这篇博客,里面有详细的解释 大端 小端 原码 反码 补码 及内存中的表现_YZF_Kevin的博客-CSDN博客
先回顾下varint的编码,解码过程
编码原理
varint 对数字的二进制,从右往左,每7位分割成一块
如果不是最后一块,则最左边补1,组成一个字节
如果是最后一块,则左边缺的全部补0,组成1个字节
最终保存的时候,根据分割块的顺序依次从左往右填
解码原理
读取字节流后,从左往右,逐个字节判断
如果该字节最左边为1,说明varint值没读取完,后面的字节还是本varint的值,继续读。本字节最左边的1去掉后,剩下的7位留作备用
如果该字节最左边为0,说明varint值读取完毕
最终,根据分割块的顺序依次从右往左填,组成的字节流按int型解析即可
举例
数字 -1,负数在内存中以补码形式存放,先计算补码,我们以32位的整型为例
-1的源码:10000000 00000000 00000000 00000001(符号位为1表负,其他跟正数一样)
-1的反码:11111111 11111111 11111111 11111110 (符号位不变,其他位全部取反)
-1的补码:11111111 11111111 11111111 11111111 (反码+1即可)
但是varint对负数统一是用64位来表示的,所以
64位的-1在内存中表示如下
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
每7位标一个颜色,一共分成了10块(64 = 7 * 9 + 1)
1 1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111
编码过程
1. 从右往左依次取7位,第一次取出来的1111111,因为自己不是最后一块,根据规则左边补1,得到11111111
2. 重复上面的步骤,依次处理每块数据
3. 最后一块1,因为是最后一块了,根据规则左边补0,得到00000001
把这些分割后新组成的块,从左往右填
所以,最终varint表示法-1的最终格式是
11111111 11111111 11111111 1111111111111111 11111111 1111111 11111111 11111111 00000001
动手实验
proto文件和程序如下(注意:我们定义的是int32类型)
// 玩家信息
message Player {int32 uniNum = 1; // 唯一序号
}

实验结果(可以看到实际经过Marshal()序列化之后,-1确实占用了10个字节,内容和我们计算的完全一样)
结论
1. varint可以对正数编码,也可以对负数编码
2. varint编码用来表示负数时,即使指定了int32类型,varint一样会作为int64来处理,且发送时要占用10个字节,非常坑
针对varint这个问题,protobuffer也做出了优化,可以使用sint32,那就是我们下一篇要讲的zigzag编码
protobuf中zigzag编码原理_YZF_Kevin的博客-CSDN博客
相关文章:
varint原理 - 负数的编码和解码
前一篇博客 varint原理 - 正数的编码和解码_YZF_Kevin的博客-CSDN博客我们讲了varint的实现原理,举例也分析对于正数的编码,解码过程 本篇博客,我们开始举例分析负数的编码和解码,因为负数有原码,反码,补码…...
大学生口才培训需求分析
标题:大学生口才培训需求分析 摘要: 本论文旨在分析大学生口才培训的需求,通过对大学生口才培训的重要性、现状和挑战进行研究,并结合相关理论和实践经验,提出相应的培训需求和解决方案。通过本论文的研究,…...
C++:合并集合(并查集)
合并集合 一共有n个数,编号是1~n,最开始每个数各自在一个集合中。 现在要进行m个操作,操作共有2种: 1.“M a b”,将编号为a和b的两个数的所在的集合合并,如果两个数已经在同一个集合中则忽略这个操作 2.“…...
【LeetCode】数据结构题解(10)[有效的括号]
有效的括号 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 😘😘😘😘😘😘😘😘😘😘😘…...
5G用户逼近7亿,5G发展迈入下半场!
尽管普遍认为5G投资高峰期正在过去,但是从2023年上半年的情况来看,我国5G建设仍在衔枚疾走。 近日举行2023年上半年工业和信息化发展情况新闻发布会上,工信部人士透露,截至今年6月底,我国5G基站累计达到293.7万个&…...
分布式问题
1. 分布式系统CAP原理 CAP原理:指在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitontolerance(分区容忍性),三者不可得兼。 一致性(C…...
教雅川学缠论06-中枢
本系列文章之前讲的内容都只有上升和下降两类趋势,并没有提及盘整,在缠论中,中枢这个新词汇用来定义盘整,中枢: 1.至少由5条线段(或笔)组成 2.中枢是有方向的,中枢左右两侧外面的线&…...
如何调教让chatgpt读取自己的数据文件(保姆级图文教程)
提示:如何调教让chatgpt读取自己的数据文件(保姆级图文教程) 文章目录 前言一、如何投喂自己的数据?二、调教步骤总结 前言 chatgpt提示不能读取我们提供的数据文件,我们应该对它进行调教。 一、如何投喂自己的数据? 让chatgpt读…...
React Native Camera的使用
介绍 React Native Camera是一个用于在React Native应用中实现相机功能的库。它允许你访问设备的摄像头,并捕获照片和视频。 使用 安装 npm install react-native-camera --save 安装完成后,你需要链接React Native Camera库到你的项目中。可以使用以…...
【Matlab】Elman神经网络遗传算法(Elman-GA)函数极值寻优——非线性函数求极值
往期博客👉 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 本篇博客将主要介绍Elman神…...
@ControllerAdvice注解使用及原理探究 | 京东物流技术团队
最近在新项目的开发过程中,遇到了个问题,需要将一些异常的业务流程返回给前端,需要提供给前端不同的响应码,前端再在次基础上做提示语言的国际化适配。这些异常流程涉及业务层和控制层的各个地方,如果每个地方都写一些…...
Error: Design has unresolved cell reference
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 所有的unresolved cell reference问题都是cell信息没读到引起的,在dc/pt里就是db没读到,在ICC2里就是ndm没读。 ICC2中午饭这个问题可以report_design_…...
uni-app 封装api请求
前端封装api请求 前端封装 API 请求可以提高代码的可维护性和重用性,同时使得 API 调用更加简洁和易用。 下面是一种常见的前端封装 API 请求的方式: 创建一个 API 封装模块或类:可以使用 JavaScript 或 TypeScript 创建一个独立的模块或类来…...
SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心
目录 1 微服务1.1 微服务的演变1.2 微服务1.3 SpringCloud1.4 小结 2 服务拆分及远程调用2.1 服务拆分2.2 服务拆分案例2.3 实现远程调用2.4 提供者与消费者 3 Eureka注册中心3.1 Eureka的结构和作用3.2 搭建eureka-server3.3 服务注册3.4 服务发现 4 Ribbon负载均衡4.1 负载均…...
【MySQL】sql字段约束
在MySQL中,我们需要存储的数据在特定的场景中需要不同的约束。当新插入的数据违背了该字段的约束字段,MySQL会直接禁止插入。 数据类型也是一种约束,但数据类型这个约束太过单一;比如我需要存储的是一个序号,那就不可…...
森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力
森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力 音频专家森海塞尔携手富有挑战精神的 CUPRA,雕琢时代新贵车型,打造畅快尽兴的驾驶体验 全球知名音频专家森海塞尔与以颠覆传统、充满激情、不甘现状而闻名的汽车品牌 CUPRA 展开合作…...
Java、Android 加解密、编码、压缩、解压缩、Hash
对称加密: 算法:AES (128位)/ DES (56位)....等 加密原理: 原数据--->加密算法(密钥)------>密文 解密原理: 密文---->解密算法(密钥)------>原数据 非对称加密 算法&#…...
11_Pulsar Adaptors适配器、kafka适配器、Spark适配器
2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 2.3.2.Spark适配器 2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 Pulsar 为使用 Apache Kafka Java 客户端 API 编写的应用程序提供了一个简单的解决方案。 在生产者中, 如果想不改变原有kafka的代码架构, 就切换到Pulsar的…...
jupyter文档转换成markdown
背景 上一篇文章**《如何优雅地用python生成模拟数据》**我就使用jupyter写的,这个真的是万能的,可以插入markdown格式的内容,也可写代码,关键是像ipython一样,可以分步执行。 我可以这样自由的写我的博客内容&#x…...
日志框架及其使用方法
log4j和logBack,同一个人写的,logBack为log4j的升级版,SpringBoot中默认集成logBack 作用:记录软件发布后的一些bug,以及数据是怎样被操作的 传统开发弊端: 1.日志直接输出在控制台,关闭控制台后,日志消…...
解锁洛可可美学密码:用Midjourney V6实现蓬巴杜夫人级繁复纹样、柔光质感与粉金配色的5步精准控制法
更多请点击: https://intelliparadigm.com 第一章:洛可可美学的数字转译本质与Midjourney V6语义解码机制 洛可可美学以繁复卷曲的曲线、轻盈的不对称构图、粉金柔色调与自然母题(如贝壳、藤蔓、云朵)为标志,其核心并…...
LeetCode 15:三数之和 | 双指针法详解与进阶应用
LeetCode 15:三数之和 | 双指针法详解与进阶应用 引言 三数之和(3Sum)是 LeetCode 中一道经典的高频面试题,编号为 15,属于 Medium 难度范畴。这道题的核心要求是在一个整数数组中找出所有不重复的三元组,使…...
【限时开放】ElevenLabs波斯文语音调试秘钥包(含Persian SSML扩展标签库、RTL音频波形对齐工具、实时音素诊断CLI):仅支持至2024年Q3 API v2退役前
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs波斯文语音支持的演进与技术边界 ElevenLabs自2022年推出多语言TTS服务以来,波斯文(Farsi)长期处于实验性支持阶段。早期版本仅能通过自定义音色音素级微调…...
8.C# —— 随机数、DateTime时间、字符串
一、C# 随机数(伪随机 安全随机)1. 核心概念计算机中没有真正的随机数,生成的都是伪随机数(通过算法 种子计算得出)。种子相同 → 生成的随机数序列完全相同不指定种子 → 默认使用系统当前时间作为种子,…...
ChatGPT-Web-Midjourney-Proxy 终极备份策略:数据安全与灾难恢复完全指南
ChatGPT-Web-Midjourney-Proxy 终极备份策略:数据安全与灾难恢复完全指南 ChatGPT-Web-Midjourney-Proxy 是一款集成 ChatGPT、Midjourney 和 GPTs 功能的一站式 UI 工具,为用户提供便捷的 AI 交互体验。在日常使用中,数据安全与灾难恢复至关…...
2026年京东云OpenClaw/Hermes Agent配置Token Plan全步骤操作指南
2026年京东云OpenClaw/Hermes Agent配置Token Plan全步骤操作指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具…...
Midjourney盐印相风格实战手册(附12组可复用Prompt模板+SDXL交叉验证数据)
更多请点击: https://kaifayun.com 第一章:Midjourney盐印相风格的视觉溯源与美学内核 盐印相(Salted Paper Print)是19世纪早期摄影术诞生之初的核心工艺,由亨利福克斯塔尔博特于1839年系统完善。其本质是将纸基浸入…...
外泌体检测推荐公司
外泌体检测推荐公司 核心优势:外泌体领域一站式技术龙头,搭建从外泌体提取、鉴定到分子检测的完整技术体系,可提供包括样本处理、分离纯化、表征分析、核酸 / 蛋白标志物检测等全链条科研服务,实验体系成熟、整合度高、交付顺畅。…...
AIoT网关50+AI算法硬核加持,AIoT边缘计算赋能千行百业
在物联网与人工智能深度融合的时代,边缘侧的智能感知与决策能力成为行业数字化转型的核心。计讯物联TG465系列5G AIoT边缘计算机,以50成熟视觉AI算法为核心,搭载工业级强悍硬件,打造"AIIoT深度融合"的多模态智能体&…...
SubAgent 进阶:LLM 策略、工具借用与 Skill 嵌套
标签:Java SubAgent LLM策略 llmFactory allowedTools Skill嵌套 j-langchain 前置阅读:SubAgent 基础:拥有自主工具的子代理 适合人群:已掌握 SubAgent 基础用法,希望灵活控制模型选择、工具权限与多层嵌套的 Java 开…...
