关于Protobuf 输入输出中文到文件中的一系列问题

news2024/9/9 0:02:50

一、不含中文的常规处理

        

//定义
message Value
{
    repeated uint32 uiMain = 1; 
    repeated uint32 uiSub  = 2;  
}

message Simulate
{
    repeated Value data     = 1;
}



//文件
data
{
    uiMainAds :		36598
    uiMainAds :		35675
    uiMainAds :		36756  
    uiSubAds :		16924
    uiSubAds :		16488
    uiSubAds :		16984  
}
data
{
    uiMainAds :		36598
    uiMainAds :		35675
    uiMainAds :		36756  
    uiSubAds :		16924
    uiSubAds :		16488
    uiSubAds :		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_One
				uiValue : 1
			}
			stParaInfos
			{
				strParaName : "子功能2参数2"
				paraType : ParaType_Two
				uiValue : 1
			}
			stParaInfos
			{
				strParaName : "子功能2参数3"
				paraType : ParaType_Four
				uiValue : 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 sequence
            std::string octal = input.substr(i + 1, 3);

            // Convert octal string to integer
            int octalValue = std::stoi(octal, nullptr, 8);

            // Convert integer value to corresponding character
            result += static_cast<char>(octalValue);

            // Move to the next character after the octal sequence
            i += 4;
        } else {
            // Append regular character to result
            result += 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型系统学习路线

随着技术的进步&#xff0c;大模型如OpenAI的GPT-4和Sora、Google的BERT和Gemini等已经展现出了惊人的能力-从理解和生成自然语言到创造逼真的图像及视频。所以掌握大模型的知识和技能变得越来越重要。 下面是学习大模型的一些建议&#xff0c;供大家参考。 必备基础知识 **…

爬虫实战-掌上高考网实战

1.确定需求&#xff1a;爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

【NPU 系列专栏 2.6 -- - NVIDIA Xavier SoC】

文章目录 NVIDIA Xavier SoCXavier 主要组件Xavier SoC 的型号Xavier SoC 的算力Xavier AGXXavier NXXavier 应用场景自动驾驶机器人物联网(IoT)医疗设备NPU 对比SummaryNVIDIA Xavier SoC 英伟达 Xavier SoC 是英伟达推出的一款高性能系统级芯片,专门为人工智能(AI)和自…

c# - - - ASP.NET Core 网页样式丢失,样式不对

c# - - - ASP.NET Core 网页样式丢失&#xff0c;样式不对 问题 正常样式是这样的。 修改项目名后&#xff0c;样式就变成这样了。底部的内容跑到中间了。 解决 重新生成解决方案&#xff0c;然后发布网站。 原因&#xff1a; 修改项目名之前的 div 上有个这个自定义属…

Mysql开启远程控制简化版,亲测有效

首先关闭防火墙 改表法 打开上图的CMD&#xff0c;输入密码进入&#xff0c;然后输入一下指令 1.use mysql; 2.update user set host % where user root;//更新root用户的权限&#xff0c;允许任何主机连接 3.FLUSH PRIVILEGES;//刷新权限&#xff0c;使更改生效 具体参考…

详解 @RequestHeader 注解在 Spring Boot 中的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

文献笔记|综述|A Survey of Large Language Models (前3章)

A Survey of Large Language Models 题目&#xff1a;大语言模型综述 作者&#xff1a;Wayne Xin Zhao, Kun Zhou, Junyi Li et al. 来源&#xff1a;arXiv 单位&#xff1a;中国人民大学高瓴人工智能学院、中国人民大学信息学院 关键词&#xff1a;Large Language Models; Eme…

如何快速获取全网精准客流?揭秘不为人知的5大运营策略!

有同行所在的地方&#xff0c;就一定拥有咱们需要的客户。客户看的是结果&#xff0c;搜索的是问题&#xff0c;寻找的是答案。 如果没有付费流量&#xff0c;单纯靠搞免费流量&#xff0c;很多大厂的运营也会变得一文不值。一个牛逼的运营&#xff0c;不仅是会做付费流量&…

【Vue2】3-使用Vue脚手架

目录 初始化脚手架 说明 具体步骤 模板项目的结构 关于不同版本的Vue vue.config.js配置文件 ref属性 配置项props mixin&#xff08;混入&#xff09; 插件 scoped样式 总结TodoList案例 webStorage&#xff08;浏览器本地存储&#xff09; TodoList本地存储 组…

pp 5 报废 分派 替代

报废&#xff1a; 装配报废是关于成品的&#xff0c;会在生产订单自动增加数量&#xff0c;对组件有影响 但是在组件上面设置报废是不是影响成品物料的 注意&#xff1a;成品报废和组件报废数量会进行叠加的 但是物料主数据和bom同时设置报废率&#xff0c;不会叠加&#xff0…

python画蜡烛图

Claude3 Opus 在Python中&#xff0c;您可以使用各种绘图库来绘制蜡烛图&#xff0c;例如Matplotlib和Plotly。这里我以Matplotlib库为例&#xff0c;演示如何使用Python绘制蜡烛图。 首先&#xff0c;您需要安装并导入Matplotlib库。您可以使用以下命令来安装Matplotlib&…

字符串专题

1. 2. 3. 4.CtrlAltV自动生成左侧&#xff1b; 5.拼接字符串 6. 7.金额转换之CtrlAltT猛猛包裹 package 字符串; import java.util.Scanner; public class MoneyReverse {public static void main(String[] args) {//1.键盘录入一个金额Scanner sc new Scanner(System.in);i…

有关链表的oj题

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;给出一个新的指针newnode来接收&#xff0c;cur遍历原truct ListNode* head&#xff0c;tail来接收 cur->val!val的值&#xff0c;最后返回newnode。 struct ListNode* removeElements(struct Li…

Transformer--编码器和解码器(包含掩码张量,注意力机制,多头注意力机制)

1.编码器介绍 2.掩码张量 2.1掩码张量介绍 2.2掩码张量的作用 2.3生成掩码张量的代码分 2.4掩码张量可视化 3.注意力机制 3.1什么是注意力机制 3.2注意力机制的作用 3.3计算规则以及代码分析 4.多头注意力机制 &#xff08;了解&#xff09; 4.1多头注意里机制的概念…

Web基础、apache和nginx的知识及服务搭建

一、Web基础概念和常识 Web&#xff1a;为用户提供的⼀种在互联网上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联网服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊…

微服务--配置管理

现在依然还有几个问题需要解决&#xff1a; 网关路由在配置文件中写死了&#xff0c;如果变更必须重启微服务 某些业务配置在配置文件中写死了&#xff0c;每次修改都要重启服务 每个微服务都有很多重复的配置&#xff0c;维护成本高 这些问题都可以通过统一的配置管理器服…

DRAM组件级故障预测模型,如何提升系统可靠性?-2

一、DRAM原理与可靠性 在深入探讨DRAM系统的可靠性问题前&#xff0c;我们需要明确几个基本概念。首先&#xff0c;故障指的是可能导致系统错误的物理缺陷&#xff0c;而错误则是系统实际状态与期望状态之间的差异。故障可分为暂时性故障和永久性故障&#xff1a;前者由外部因…

谁说PDF编辑器都一样?这5款让你大开眼界!

如今&#xff0c;PDF文档已经成了咱们工作生活中必不可少的东西。无论是看学术报告、合同协议&#xff0c;还是日常阅读的电子书&#xff0c;都能在不同的设备上保持一致的格式&#xff0c;成了大家最爱用的文档格式之一。但是&#xff0c;面对这么多PDF编辑器&#xff0c;你是…

当我在星巴克连上家里的服务器,光猫桥接打通IPv6,你是值得的

我们的课程环境是构建在一个256GB内存&#xff0c;192核CPU的集群上&#xff0c;学员可以通过浏览器&#xff0c;输入地址访问。要在阿某云上租这样一个服务器&#xff0c;价格并不便宜。所以&#xff0c;这些服务器一直放在公司里&#xff0c;创业期间&#xff0c;公司也就是租…