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