写一个小工具遇到的问题记录
2013-03-02 11:57
302 查看
工具功能:
通过该工具调用rslogo.exe生成samsung.c(其内容为一个有600多K的数组),将samsung.c中的数组读取出来并以二进制的方式保存到kmt_iii.sys文件中。生成的kmt_iii.sys文件通过单独的刷机就可以修改wince的启动背景图片。
Q1、读取samsung.c中的数组。
读取文件很简单,但是读取出来的是字符型的数据,需要将其转换为16进制,实现将0x####转换为整形数据,运用了以下方法:
Q2:数组定义问题。
之前的定义:unsigned short hStr[] = {0};
本意是定义一个足够大的数组,而这样只定义了数组大小为1的数组。不出问题才怪,最后还是CSDN上的朋友帮忙指出的。哎,基础很重要啊!引以为戒。
改为这样定义:unsigned short hStr[16];
Q3:文件写入问题。
程序基本都做好了,但是写入发现了问题,本来是153600字节的大小,可是写到kmt_iii.sys文件中竟然多出了几十个字节。后来我是一行一行的看,测试,终于看出问题出在哪里了。
程序中我运用的是CStdioFile操作的文件,包括创建和读写。这里就涉及到了CStdioFile类的特殊性,在向CStdioFile类文件写入数据的时候,若是写入“\n”(即0x0A),系统会自动在前面加一个“\r”(0x0D)一同写入。(PS:在win7系统中测试就不会这样,不知是系统问题还是其他问题呢?)
问题就出现在这里了,我写入的数组,其中有包含0x0A,前面就会多加一个字节的0x0D,这样,本来153600字节的文件,写入文件中就会多出一些字节了。后来用了C中用的FILE来操作文件,问题就解决了。又是一个基础性的问题,细节真的很重要!
编写这个小工具过程中,基本上就这3点印象较为深刻的问题,总结起来一句话:基础很重要,细节很重要!写在这里,来警醒自己!
通过该工具调用rslogo.exe生成samsung.c(其内容为一个有600多K的数组),将samsung.c中的数组读取出来并以二进制的方式保存到kmt_iii.sys文件中。生成的kmt_iii.sys文件通过单独的刷机就可以修改wince的启动背景图片。
Q1、读取samsung.c中的数组。
读取文件很简单,但是读取出来的是字符型的数据,需要将其转换为16进制,实现将0x####转换为整形数据,运用了以下方法:
int CChangeBgPicDlg::CString2hex(CString str,int Count) { int a,b,c,d; if (str[Count]>='0' && str[Count]<='9') a = str[Count] - '0'; else if(str[Count]>='a' && str[Count]<='f') a = str[Count]-'a'+10; else if(str[Count]>='A' && str[Count]<='F') a = str[Count]-'A'+10; else return -1; if (str[Count + 1]>='0' && str[Count + 1]<='9') b = str[Count + 1]-'0'; else if(str[Count + 1]>='a' && str[Count + 1]<='f') b = str[Count + 1]-'a'+10; else if(str[Count + 1]>='A' && str[Count + 1]<='F') b = str[Count + 1]-'A'+10; else return -1; if (str[Count + 2]>='0' && str[Count + 2]<='9') c = str[Count + 2]-'0'; else if(str[Count + 2]>='a' && str[Count + 2]<='f') c = str[Count + 2]-'a'+10; else if(str[Count + 2]>='A' && str[Count + 2]<='F') c = str[Count + 2]-'A'+10; else return -1; if (str[Count + 3]>='0' && str[Count + 3]<='9') d = str[Count + 3]-'0'; else if(str[Count + 3]>='a' && str[Count + 3]<='f') d = str[Count + 3]-'a'+10; else if(str[Count + 3]>='A' && str[Count + 3]<='F') d = str[Count + 3]-'A'+10; else return -1; return a * 4096 + b * 256 + c * 16 + d; }看起来真是很繁琐哦,不过倒是好用,不知各位有无其他巧妙一些的算法呢?希望指教。
Q2:数组定义问题。
之前的定义:unsigned short hStr[] = {0};
本意是定义一个足够大的数组,而这样只定义了数组大小为1的数组。不出问题才怪,最后还是CSDN上的朋友帮忙指出的。哎,基础很重要啊!引以为戒。
改为这样定义:unsigned short hStr[16];
Q3:文件写入问题。
程序基本都做好了,但是写入发现了问题,本来是153600字节的大小,可是写到kmt_iii.sys文件中竟然多出了几十个字节。后来我是一行一行的看,测试,终于看出问题出在哪里了。
程序中我运用的是CStdioFile操作的文件,包括创建和读写。这里就涉及到了CStdioFile类的特殊性,在向CStdioFile类文件写入数据的时候,若是写入“\n”(即0x0A),系统会自动在前面加一个“\r”(0x0D)一同写入。(PS:在win7系统中测试就不会这样,不知是系统问题还是其他问题呢?)
问题就出现在这里了,我写入的数组,其中有包含0x0A,前面就会多加一个字节的0x0D,这样,本来153600字节的文件,写入文件中就会多出一些字节了。后来用了C中用的FILE来操作文件,问题就解决了。又是一个基础性的问题,细节真的很重要!
编写这个小工具过程中,基本上就这3点印象较为深刻的问题,总结起来一句话:基础很重要,细节很重要!写在这里,来警醒自己!
相关文章推荐
- 记录在eclipse中使用ant遇到到的一个小问题
- swoole:swoole_async_writefile和onManagerStart遇到的一个问题记录
- 记录最近面试时遇到的一个问题:Android root的原理
- 使用cocoapods遇到的一个问题,记录
- 最近开发遇到一个传值和引用问题 记录一下
- 记录下遇到的一个比较坑爹的问题
- 今天遇到的一个浏览器会记录密码缓存的问题
- 自己遇到的一个单例模式的问题记录
- 今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- 记录今天学习SQL遇到的一个小问题
- 今天使用VS2015遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- 数据库开发红皮书实例遇到的一些问题:“找不到可安装的ISAM” “BOF或EOF中有一个是'真',或者当前的记录已被删除……”
- [工作随笔]记录一个App项目所遇到的问题及解决
- 今天先学了一个数据库语句,我先记录下来,果然是在工作中遇到的问题,印象更深刻啊
- [项目过程中所遇到的各种问题记录]工具篇——.NET开发时常用的工具类库
- [项目过程中所遇到的各种问题记录]学习篇——对工作以来的学习过的开源项目进行总结—动软代码生成工具
- Hibernate保存记录时遇到的一个问题----evitic,not-null配置及主键生成策略
- Stream学习过程中遇到的一个问题记录
- 遇到一个Mysql死锁问题,记录下
- 记录一个使用Hibernate Validator验证信息参数化遇到的问题