关于Protobuf 输入输出中文到文件中的一系列问题
一、不含中文的常规处理
//定义
message Value
{repeated uint32 uiMain = 1; repeated uint32 uiSub = 2;
}message Simulate
{repeated Value data = 1;
}//文件
data
{uiMainAds : 36598uiMainAds : 35675uiMainAds : 36756 uiSubAds : 16924uiSubAds : 16488uiSubAds : 16984
}
data
{uiMainAds : 36598uiMainAds : 35675uiMainAds : 36756 uiSubAds : 16924uiSubAds : 16488uiSubAds : 16984
}
1、从文件中读取
//适用于linux 平台,因为可以方便的获取文件描述符int infile = open("./sys.cfg", O_RDONLY);if (infile < 0){printf("open sys.cfg failed.\n");return;}google::protobuf::io::FileInputStream fileInput(infile);if (!google::protobuf::TextFormat::Parse(&fileInput, &m_cfg)) //将文件内容转为m_cfg(SysConfig){printf("Parse sys.cfg failed.\n");close(infile);return;}close(infile);//c++ 通用模式std::ifstream input("./cfg/debugger.cfg", std::ios::in );if (!input){return false;}DebugFile m_cfgFileData;google::protobuf::io::IstreamInputStream istr( &input);bool pa = google::protobuf::TextFormat::Parse(&istr, &m_cfgFileData);
2、写入文件(是人可读的,有点类似与json 格式那种)
//c++ 通用模式 std::ofstream ofs("./cfg/test.txt", std::ios_base::out | std::ios_base::binary);if (!ofs){return false;}DebugFile m_cfgFileData; google::protobuf::io::OstreamOutputStream ostr( &ofs);google::protobuf::TextFormat::Print(m_cfgFileData, &ostr);
二、如果定义中是bytes ,且值是中文的
//定义
message STParaInfo
{required bytes strParaName = 1; //参数名称required ParaType paraType = 2; //参数类型 required uint32 uiValue = 3; //参数值
};
message STSendPara
{repeated STParaInfo stParaInfos = 1; //参数信息
};//文件
stSendPara{stParaInfos{strParaName : "子功能2参数1"paraType : ParaType_OneuiValue : 1}stParaInfos{strParaName : "子功能2参数2"paraType : ParaType_TwouiValue : 1}stParaInfos{strParaName : "子功能2参数3"paraType : ParaType_FouruiValue : 1}}
1、读取,还是可以正常读取,但是获取到的 strParaName 值,是八进制转义字符串,,如果是qt 等使用,使用QString 去转一下,还是可以直接获取到中文字符串的,
2、写入,,如果直接使用上述方式写入,,,文件中的中文 就是八进制转义字符串,,是人不可读的,,如下
strParaName : "\346\265\213\350\257\225\345\215\225\345\205\203 "
三、解决,只能通过自己转换的方式
//ai 编写的转换函数
std::string octalToChinese(const std::string& input) {std::string result;size_t i = 0;while (i < input.length()) {if (input[i] == '\\' && i + 3 < input.length() &&input[i + 1] >= '0' && input[i + 1] <= '7' &&input[i + 2] >= '0' && input[i + 2] <= '7' &&input[i + 3] >= '0' && input[i + 3] <= '7') {// Extract the octal sequencestd::string octal = input.substr(i + 1, 3);// Convert octal string to integerint octalValue = std::stoi(octal, nullptr, 8);// Convert integer value to corresponding characterresult += static_cast<char>(octalValue);// Move to the next character after the octal sequencei += 4;} else {// Append regular character to resultresult += input[i];i++;}}return result;
}
//使用std::ofstream ofs("./cfg/test.txt", std::ios_base::out | std::ios_base::binary);if (!ofs){return false;}//这里用Utf8DebugString 去获取proto mssage 的 字符串 ,然后使用转换函数转换 ,不用序列化是因为序列化的字符串是不可读的std::string fout = octalToChinese(m_cfgFileData.Utf8DebugString());ofs << fout;
相关文章:
关于Protobuf 输入输出中文到文件中的一系列问题
一、不含中文的常规处理 //定义 message Value {repeated uint32 uiMain 1; repeated uint32 uiSub 2; }message Simulate {repeated Value data 1; }//文件 data {uiMainAds : 36598uiMainAds : 35675uiMainAds : 36756 uiSubAds : 16924uiSubAds : 16488uiSu…...

后端笔记(1)--javaweb简介
1.JavaWeb简介 *用Java技术来解决相关web互联网领域的技术栈 1.网页:展现数据 2.数据库:存储和管理数据 3.JavaWeb程序:逻辑处理 2.mysql 1.初始化Mysql mysqld --initialized-insecure2.注册Mysql服务 mysqld -install3.启动Mysql…...

便携式气象监测系统的优势:精准高效,随行监测
在快速变化的自然环境中,气象信息的准确获取与及时分析对于农业生产、环境保护、科学研究乃至日常生活都至关重要。随着科技的飞速发展,便携式气象监测系统以其独特的优势,正逐步成为气象监测领域的新宠,引领着气象监测技术的革新…...
uniapp App判断是否安装某个app
参考文档:HTML5 API Reference 项目中需要判断是否安装了uber,这里拿uber举例 ,判断是否安装uber if (plus.runtime.isApplicationExist({pname: com.ubercab.eats, //Android平台通过pname属性(包名)查询action: ub…...

C/C++大雪纷飞代码
目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码,一起来看看吧! 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…...
【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解
具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解 背景 -学习Linux设备树 代码 soc {soc_gpio1: gpio-controller1 {#gpio-cells = <2>;};soc_gpio2: gpio-controller2 {#gpio-cells = <2>;}; };connector: connector {#gpio-cells = <2>…...

【2025留学】德国留学真的很难毕业吗?为什么大家不来德国留学?
大家好!我是德国Viviane,一句话讲自己的背景:本科211,硕士在德国读的电子信息工程。 之前网上一句热梗:“德国留学三年将是你人生五年中最难忘的七年。”确实,德国大学的宽进严出机制,延毕、休…...
Apache Solr 最常用的命令
目录 一、Solr 安装与配置 1.1 下载与安装 1.2 启动与停止 二、Core 和 Collection 管理 2.1 创建与删除 2.2 核心操作 三、索引管理 3.1 添加与删除文档 3.2 批量操作 3.3 提交与优化 四、查询与检索 4.1 基本查询 4.2 高级查询 五、Schema 管理 5.1 字段管理 …...

经济下行,企业还在“裁员至上”?
最近小红书、B站崩溃,又延伸到某云服务厂商问题频发,让人忍不住戏谑:“这算不算裁员裁到大动脉?” 在阿道看来,各大企业的裁员动作,绕不开的依旧是“人月神话”:盲目加人带来的是成本的倍增和效…...

学习笔记之Java篇(0729)
p 数组 大纲知识点数组的概念数组的定义、四个特点数组的常见操作普通遍历、for-each遍历、java.util.Array类用法多维数组多维数组的内存结构、存储表格、Javabean和数组存储表格常见算法冒泡排序基础算法、冒泡排序优化算法、二分法查找(折半查找) 1、…...
吃肉的刷题记录4-基础知识-字符串
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 leetcode.186.反转字符串中的单词 leetcode.186.反转字符串中的单词 https://leetcode.cn/problems/reverse-words-in-a-string-ii/ 给你一个字符数组 s …...
人工智能与机器学习原理精解【7】
文章目录 凸优化基础理论加权正规方程线性回归模型加权最小二乘法加权正规方程注意使用Diagonal函数使用diagm函数总结 加权最小二乘法加权最小二乘法的定义加权最小二乘法的算法加权最小二乘法的计算加权最小二乘法的原理一、基本思想二、原理详解三、总结 加权最小二乘法的例…...

ResNet学习笔记
《Deep Residual Learning for Image Recongition》:用于图像分类的深度残差学习。 ResNet(残差网络)是在2015年由微软研究院的Kaiming He等人提出的,旨在解决深度神经网络训练过程中的梯度消失、梯度爆炸问题,并允许…...

使用chainlit快速构建类似OPEN AI一样的对话网页
快速开始 创建一个文件,例如“chainlit_chat” mkdir chainlit_chat进入 chainlit_chat文件夹下,执行命令创建python 虚拟环境空间(需要提前安装好python sdk。 Chainlit 需要python>3.8。,具体操作,由于文章长度问题就不在叙述…...

【根据字符出现频率排序】python刷题记录
R2-字符串算法 包哈希表的呀。 注意 class Solution:def frequencySort(self, s: str) -> str:dictdefaultdict(list)#字符串不能直接排序,需要转换为列表["a","b","c"]slist(s)for str in s:if not dict[str]:dict[str]1else:…...

活动报名小程序
#活动报名工具# # 活动报名小程序 ## 项目简介 一款通用的活动报名工具,包含活动展示,微信支付,订单管理,分享评价等功能。 品客聚精彩,有你才精彩!不只有线下活动还可以进行线上裂变活动。 …...
unity基础问题
1.一个列表中的UI有放大效果,用什么实现? 缩放,Layout组件可以勾选使用子级缩放,这样缩放之后也能保持间距 2.UGUI事件传递机制的冒泡机制是怎样的 事件系统从内向外遍历UI层次结构,通知父级UI元素有关该事件的信息。类…...

RedHat Enterprise Linux 7 YUM源(本地/网络源)配置详解
目录 一、挂载 二、建立本地源 三、建立网络源 四、验证可行性 一、挂载 ——将光盘挂载到 /mnt 下 当/mnt中有如图内容时,即挂载成功 若挂载光驱/dev/sr0时报错:mount: no medium found on /dev/sr0 解决措施:查看该设备状态是否全部勾选…...

关于顺序表数组下标的一些关系梳理
...

VS C++ Project(项目)的工作目录设置
如果只是简单创建一个VS CProject或者MFC Project,可能很多时候,只关心将Project放在硬盘的那个位置,与Project目录相关的的其他问题,并不引人注意,我们也不是十分在意。有时我们不得不进行工作目录方面的设置…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...