nanopb options中的max_length和max_size
1. 引言一句话概括max_length用于string字段max_size用于bytes字段。两者虽然都是限制字段大小但针对的数据类型和生成的 C 结构完全不同。2.max_length用于stringmax_length只能用于string类型例如message Person { string name 1; }对应的.optionsPerson.name max_length:32nanopb 会生成charname[33];注意这里为什么是33而不是 32。原因在于max_length表示字符串的最大长度不包含字符串结束符\0nanopb 会自动额外分配一个字节用于存放\0。因此max_length实际数组大小32char[33]64char[65]256char[257]这也是 C 语言字符串的标准表示方式。3.max_size用于bytesmax_size用于bytes字段如message Transaction { bytes signature 1; }对应 optionsTransaction.signature max_size:65nanopb 会生成类似PB_BYTES_ARRAY_T(65)signature;其内部结构大致相当于struct{pb_size_tsize;uint8_tbytes[65];};这里size记录当前实际长度bytes[]存放原始二进制数据。由于bytes并不是字符串因此不存在\0的概念max_size就表示允许存放的最大字节数。4. 为什么不能混用虽然两者看起来都在限制长度但它们对应的数据结构完全不同。例如string url 1;应该写Witness.url max_length:256生成charurl[257];而不是Witness.url max_size:256因为string最终会生成char[]。反过来bytes hash 2;应该写Transaction.hash max_size:32生成PB_BYTES_ARRAY_T(32)而不是max_length:32因为 Hash 本质上是一段二进制数据并不是 UTF-8 字符串。5. 典型示例5.1 示例一TRON Witness URLstring url 1;对应Witness.url max_length:256生成charurl[257];5.2 示例二ECDSA 签名bytes signature 2;对应Transaction.signature max_size:65生成PB_BYTES_ARRAY_T(65)5.3 示例三压缩公钥bytes public_key 3;对应Transaction.public_key max_size:33生成struct{pb_size_tsize;uint8_tbytes[33];};6. 如果是 repeated bytes 呢例如repeated bytes proofs 4;通常需要同时限制Proof.proofs max_size:96 Proof.proofs max_count:8其中max_size限制每个bytes元素最大为 96 字节max_count限制整个数组最多包含 8 个元素。两者共同决定最终分配的内存大小。7. 为什么 nanopb 要区分这两个选项这是由 Protobuf 的类型决定的。对于stringProtobuf 要求其内容必须是 UTF-8 字符串。因此 nanopb 为了方便 C 程序使用直接生成char[]为了兼容所有 C 字符串函数需要自动保留一个\0因此采用max_length。而对于bytes本质上只是任意二进制数据例如00 FF 80 01这些数据中间完全可能包含0x00因此不能使用char*或依赖结束符。只能采用sizebytes[]的结构因此使用max_size来限制最大字节数。8. 总结Option适用字段含义nanopb 生成结构max_lengthstring字符串最大长度不含\0char[max_length 1]max_sizebytes二进制数据最大长度PB_BYTES_ARRAY_T(max_size)max_countrepeated最大元素个数固定大小数组因此在 nanopb 等嵌入式项目中可以记住一个简单的经验法则string→ 使用max_lengthbytes→ 使用max_sizerepeated→ 再结合max_count限制数组元素数量这样既能保证生成固定大小的内存结构又能避免动态内存分配非常适合资源受限的嵌入式设备。

相关新闻

顺德区消防改造工程公司

顺德区消防改造工程公司

在顺德区,消防安全至关重要,尤其是各类建筑的消防改造工程,关乎着人们的生命财产安全。今天,我们就来深入了解一家在顺德区备受认可的消防改造工程公司——佛山市顺德区顺港消防安装工程有限公司(简称顺港消防&#xf…

2026/7/23 17:28:46阅读更多 →
AI论文助手:智能降重与语言优化的核心技术解析

AI论文助手:智能降重与语言优化的核心技术解析

1. 项目概述:AI论文助手的核心价值解析"爱毕业aibiye的AI论文助手"是一款面向学术写作场景的智能工具,其核心功能聚焦于两大刚需:智能降重与语言优化。在当前的学术环境下,论文原创性检测标准日益严格,传统人…

2026/7/23 17:26:45阅读更多 →
Gemini 3\.5 Flash Cyber实战教程:AI自动化漏洞挖掘部署与代码安全审计落地

Gemini 3\.5 Flash Cyber实战教程:AI自动化漏洞挖掘部署与代码安全审计落地

前言 网络安全行业长期存在一个无解的底层矛盾:人工安全审计的迭代速度,永远追不上代码迭代和漏洞爆发的速度。大型互联网企业、政企单位的代码仓库日均提交数千次变更,开源依赖库每周更新数十个版本,传统人工渗透测试、静态代码扫…

2026/7/23 17:26:45阅读更多 →
《硬盘突然打不开?别慌!专业数据恢复告诉你哪些操作千万别做》

《硬盘突然打不开?别慌!专业数据恢复告诉你哪些操作千万别做》

在日常使用电脑的过程中,很多人都会遇到硬盘突然打不开的情况。可能是双击盘符后长时间无响应,可能是提示无法访问,也可能是直接弹出错误对话框。遇到这种问题,大多数用户第一反应是反复尝试打开、重启电脑、插拔硬盘,…

2026/7/23 18:47:02阅读更多 →
CMU 15-213 CSAPP:并发编程与同步的艺术(Concurrent Programming)

CMU 15-213 CSAPP:并发编程与同步的艺术(Concurrent Programming)

写在前面:这是本系列系统级编程学习笔记的终章。 当我们的 Web 服务器终于能够通过网络响应一个客户端之后,新的问题接踵而至:如果同时有一万个人访问怎么办?并发编程(Concurrent Programming)是现代计算机…

2026/7/23 18:47:02阅读更多 →
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存

【Rust自学】4.1. 所有权:栈内存 vs. 堆内存

4.1 所有权:栈内存 vs. 堆内存 4.1.0 写在正文之前 在学习了 Rust 的通用编程概念后,就来到了整个 Rust 的重中之重——所有权。它跟其他语言都不太一样,很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有五…

2026/7/23 18:47:02阅读更多 →
mpweixin 微信打卡小程序

mpweixin 微信打卡小程序

一、关键词微信打卡、积分兑换、打卡排行、惩罚措施、社交论坛二、作品包含源码数据库全套环境和工具资源本地部署教程三、项目技术前端技术: Html、Css、Js、Vue2.6、Element-ui、uniapp后端技术:Java、SpringBoot2.2.2、MyBatis-Plus四、运行环境&…

2026/7/23 18:47:02阅读更多 →
【Rust自学】4.2. 所有权规则、内存与分配

【Rust自学】4.2. 所有权规则、内存与分配

4.2 所有权规则、内存与分配 4.2.0 写在正文之前 在学习了 Rust 的通用编程概念后,就来到了整个 Rust 的重中之重——所有权。它跟其他语言都不太一样,很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有五小节&#xf…

2026/7/23 18:47:02阅读更多 →
GraphRAG技术深度解析:知识图谱驱动的检索增强生成

GraphRAG技术深度解析:知识图谱驱动的检索增强生成

GraphRAG技术深度解析:知识图谱驱动的检索增强生成 随着大语言模型在企业知识管理场景的深入应用,传统向量RAG在处理需要多跳推理、全局总结和关系分析的复杂查询时逐渐力不从心。GraphRAG(图检索增强生成)通过将知识库构建为知识…

2026/7/23 18:45:02阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →