文章目录

  • 前言
  • 一、项目环境
  • 一、项目需求
  • 二、思路分析
  • 三、实现过程
    • 1.字符串转十六进制字符
    • 2.替换功能
  • 总结

前言

在工作中遇到一个功能需求,就是读取一个资源文件,替换资源文件中某些字符,由于资源文件无法转化成字符串去替换,因为资源文件中有各种数据内容,那么怎么处理这个问题呢,我思考了几天想出一个较为完美的办法解决了这个问题,正文详细解说解决思路。


一、项目环境

VS2017下MFC程序

一、项目需求

读取一个资源文件(例如:VS2017项目文件中的xx.aps文件),替换资源文件中的oldName字符为newName字符

二、思路分析

资源文件xx.aps文件如果按常规的编码读入,转化为字符串然后替换字符串,再将转化后的数据写回去,这样是不可行的。因为资源文件并不完全是字符串类型的数据,里边包括了各种数据内容,如果强制全部转化为字符串必然出错。

分析MFC的可用函数
文件操作类:CFile
替换函数:CString::Replace()
我们用CFile以二进制读入xx.aps文件,并将二进制数据以十六进制字符形式转化为CString字符串,同时将oldName和newName都转化为十六进制字符,此时CString::Replace替换oldName十六进制字符为newName十六进制字符,然后把替换后的十六进制字符转化为二进制数据再用CFile写入回原文件,这样就巧妙得把任何数据转化为我们能够使用替换功能的CString字符串,从而达到我们的目的,这里我们约定全文使用:两位十六进制字符+空格,这样的格式进行十六进制转化,例如:6F B3 2C 66 2A

三、实现过程

1.字符串转十六进制字符

用于将oldName、newName字符串转化为十六进制字符串,代码如下:

CString toHex(CString str)
{CString sRet = "";//获取str的长度DWORD len = str.GetLength();//将获CString转化为char*char *tmp = new char[len + 1];memset(tmp, 0, len + 1);strcpy(tmp, str.GetBuffer(len));for (int i = 0; i < len; i++){//按两位十六进制字符格式组建sRet字符串sRet.AppendFormat("%02X ", (unsigned char)tmp[i]);}delete[]tmp;return sRet;
}

2.替换功能

传入文件路径,替换oldName为newName,并返回替换数量,代码如下:

int replaceFile(CString strDir, CString oldName, CString newName)
{int iRet = 0;CFile file;// 以二进制读写模式打开strDirif (file.Open(strDir, CFile::modeReadWrite | CFile::typeBinary) == FALSE){return iRet;}//获取读入数据的长度DWORD len = file.GetLength();if (len == 0){return iRet;}//创建存储数据buf,并读入数据char *buf = new char[len + 1];memset(buf, 0, len + 1);file.Read(buf, len);//将读入的二进制char*转化为cstring十六进制文本CString cbuf;for (int i = 0; i < len; i++){cbuf.AppendFormat("%02X ", (unsigned char)buf[i]);}//把oldName、newName都转化为约定的十六进制格式进行替换,iRet接收替换数量iRet = cbuf.Replace(toHex(oldName), toHex(newName));//计算替换后的文本对应char*数组长度,我们约定的(两位十六进制字符+空格)格式是3个长度DWORD wlen = (DWORD)(cbuf.GetLength() / 3) + 1;//定义用于写数据的char*,并将数组清0char* wbuf = new char[wlen];memset(wbuf, 0, wlen);//对每个char数组成员赋值替换后的十六进制数据for (int i = 0; i < wlen - 1; i++){//精髓在这里,巧妙的利用CString::Mid函数取出对应位置的十六进制字符,//通过strtol函数把字符串转化为整数,再赋值给写出的wbuf,//这样完成十六进制字符转化成char*写出数据wbuf[i] = strtol(cbuf.Mid(i * 3, 2), 0, 16);}//指向文件开头file.SeekToBegin();//清空文件内容file.SetLength(0);//写入数据file.Write(wbuf, wlen);//别忘了删除new出来的对象delete[] wbuf;delete[] buf;file.Close();return iRet;
}

总结

实现本需求的关键

1. 深刻理解char型数组操作
2. 理清不可控制的二进制数据与可操作的CString字符的相互转化过程
3. 明白数据资源文件的读写操作

二进制数据文件中的字符串替换的实现(C++)相关推荐

  1. Java实验9 T3.对二进制数据文件中的所有数据求和

    题目要求 (对二进制数据文件中的所有数据求和)假设已经使用DataOutputStream中的writeInt(int)创建一个名为Exercise 19_3.dat的二进制数据文件,文件包含数目不确 ...

  2. python 操作word 替换字符串为图片_用python将.docx文件中的字符串替换为jpg

    对不起,我的英语不好.在 我试图用.jpg文件替换.docx文件中的字符串.首先,我将JPEG转换为BMP并将其移动到剪贴板,然后使用找到.执行用"^c"替换docx文件中的特殊字 ...

  3. 批量xml文件中的字符串替换

    替换批量xml文件中的内容 替换批量xml文件中的内容 1.实现代码 替换批量xml文件中的内容 1.实现代码 package testpackage;import java.io.BufferedR ...

  4. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  5. linux sed 批量替换多个文件中的字符串

    原文: http://blog.csdn.net/kauu/article/details/1757325 一.linux sed 批量替换多个文件中的字符串 sed -i "s/oldst ...

  6. python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...

    我有一个处理脚本,用于提取"uint16"类型的二进制数据文件,并一次以6400块的形式进行各种处理.该代码最初是用Matlab编写的,但由于分析代码是用 Python编写的,我们 ...

  7. 如何在Linux命令行中替换多个文件中的字符串

    本文翻译自:How to replace a string in multiple files in linux command line I need to replace a string in ...

  8. python替换文件中的字符串_Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)...

    题目: 1.首先将文件:/etc/selinux/config 进行备份 文件名为 /etc/selinux/config.bak 2.再文件:/etc/selinux/config 中的enforc ...

  9. java 替换文件中的字符串

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Prin ...

最新文章

  1. MySQL的log_bin和sql_log_bin 到底有什么区别?
  2. Spring Boot第四篇:SpringBoot 整合JPA
  3. JAVA配置注解方式搭建简单的SpringMVC前后台交互系统
  4. 获取含跨域网址的框架网页的源码
  5. JDK 8 新特性 之 Strams简单使用
  6. HDU 3590 PP and QQ(反nim博弈,删边游戏)
  7. 蓝桥杯-组素数-java
  8. 【学习笔记4】Action名称的搜索顺序
  9. 梯度投影算法 matlab,梯度投影法及其Matlab实现
  10. n 的第 k 个因子
  11. 广西大学计算机硕导名单,导师-广西大学研究生院
  12. JavaSE基础——面向对象
  13. 计算机学术论文3000字,计算机学术论文3000字_计算机学术毕业论文范文模板.doc...
  14. 阳阳智能开关固件2.0版本
  15. 初学者该如何入手云计算
  16. 微信号注册人工服务器,两个方法让你一次性找到微信人工客服,简单而又粗暴!...
  17. 惊呆!200行代码就能实现的隐身术你见过么?
  18. java:打印1—100的数中有7和7的倍数
  19. 短信接口抓包_[实战] 实现抢票小工具amp;短信通知提醒
  20. 阿里云第七代ECS现已上线

热门文章

  1. 暖风熏的游人醉 直把杭州作汴州 题临安邸--林升
  2. rust语言与go语言_用户调查显示,Rust语言很难学习和使用
  3. 基于SSM的校园兼职管理系统
  4. 牛顿-莱布尼兹公式的几何意义-微分和积分的几何关系
  5. 5月14日社区技术直播【Analytics Zoo上的分布式TensorFlow训练AI玩FIFA足球游戏】
  6. 计算机管理员和用户名区别,Administrator记不住?教你自定义管理员账户名称
  7. DBeaver解决连接Oracle之后出现库名为数字问题
  8. python3 结束进程
  9. Q1营收7740万元亏损大幅收窄,转型自救的途牛能否追赶携程艺龙?
  10. 裁员潮下的打工人,怎么把手里的饭碗端稳?