写一个小工具遇到的问题记录

来源:互联网 发布:c语言计算元音字母 编辑:程序博客网 时间:2024/05/16 09:32

工具功能:

通过该工具调用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点印象较为深刻的问题,总结起来一句话:基础很重要,细节很重要!写在这里,来警醒自己!

原创粉丝点击