一个简单的读写文件程序-适用于MTK平台资源管理

DOS下运行的软件具有编写简单,操作快捷,支持批操作等一系列优点,所以在Win和各种可视化操作系统极大盛行的今天,仍然能够在电脑中看到他的身影。这里提供一个我写的MTK铃声生成工具。把下面的C代码拷贝到VC里直接编译就可以了。把客户提供的铃声放到同一个文件夹里,把生成的.exe文件拷贝到该文件里后,双击就可以生成需要的C文件。这里主要使用了读写文件函数和查找文件函数,并提供了一个查找相关类型文件的算法,简单的对MAIN函数参数做了解析。该程序主要用于MTK平台开发,MTK平台使用的铃声与图片一般都是以数组方式存放,而手工使用UE把铃声或者图片打开,一个一个的存放到数组里显然是不现实的。写一个小程序实现该功能,有时有一件很有趣的事,既可以复习一下C语言知识,也可以学以致用。本程序是在匆匆之下写就,错误之处在所难免,欢迎指证。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>

#define FORMAT_IMY (18)   /* sync with med_main.h */
#define FORMAT_MID (17)   /* sync with med_main.h */
#define FORMAT_WAV (13)   /* sync with med_main.h */
#define FORMAT_MMF (20)   /* sync with med_main.h */
#define FORMAT_MP3 (5)   /* sync with med_main.h */
#define FORMAT_PCM (7)   /* sync with med_main.h */
#define FORMAT_DVI (11)   /* sync with med_main.h */
#define FORMAT_AMR (3)   /* sync with med_main.h */

char * getfilename(char * filename)
{
 char strResult[128]={0}; //保存结果
 char *temp, *ret;
 int i;
 
 temp = filename;
 int nStrLen = strlen(filename); //原始字符串长度
 
 for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
 {
  if (filename[i] == '//')    //如果当前字符是反斜杠
  {
   break;
  }
 }
 if(i == 0)
 {
  ret = temp;
 }
 else
 {
  ret = (temp+i+1);
 }
 return (ret); 
}
char * getfileextname(char * filename)
{
 char strResult[128]={0}; //保存结果
 char *temp, *ret;
 int i;
 
 temp = filename;
 int nStrLen = strlen(filename); //原始字符串长度
 
 for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
 {
  if (filename[i] == '.')    //如果当前字符是反斜杠
  {
   ret = (temp+i+1);
   break;
  }
 }
 
 return (ret); 
}
BOOL isMusicFile(char * filename)
{

if (memcmp(filename, "null", 4)==0)
 {
  return false;
 }

 if ((memcmp(getfileextname(filename), "mp3", 3) == 0) ||
  (memcmp(getfileextname(filename), "mid", 3) == 0) ||
  (memcmp(getfileextname(filename), "wav", 3) == 0)
  )
 {
  return true;
 }
 else
 {
  return false;
 }
}
int getfilevalue(char * extfilename)
{
 if (memcmp(extfilename, "mp3", 3) == 0)
 {
  return (int)FORMAT_MP3;
 }
 else if (memcmp(extfilename, "mid", 3) == 0)
 {
  return (int)FORMAT_MID;
 }
 else if (memcmp(extfilename, "wav", 3) == 0)
 {
  return (int)FORMAT_WAV;
 }
 else 
 {
  return 0;
 }
}
char * modifystr(char * str)
{
 char *tmp;
 int i;
 
 tmp = str;
 for (i = 0; i < (int)strlen(str)-1; i++)
 {
  if ((str[i] == ' ') || (str[i] == '.'))
  {
   *(tmp+i) = '_';
  }
 }
 
 return tmp; 
}
int music2res(char * music, char * res)
{
 long infileLen;             //文件长度
 int n=0,num=1;             //n 字节计数器, NUM换行指示
 unsigned char c, c_in;     //C_in文件字节,C转化
 FILE *fh_in;
 FILE *fh_out;
 char com[256]={0};
 char filename[256]={0};
 
 assert((music != NULL) && (res != NULL));
 
 fh_in = fopen(music,"rb");
 if (NULL==fh_in)
 {
  printf("open read file error!!");
  return 1;
 }
 
 fseek(fh_in,0,SEEK_END);
 infileLen=ftell(fh_in);
 fseek(fh_in,0,SEEK_SET);
 
 fh_out=fopen(res,"ab");
 if (NULL==fh_out)
 {
  printf("open write file error!!");
  return 1;
 }
 /*写入注释*/
 memcpy(filename, getfilename(music), 256);
 
    sprintf(com, "/*The alert is : %s, size is: %ld byte */", filename, infileLen);
 fputs(com, fh_out);
 putc(0x0d,fh_out);
 putc('/n',fh_out);
 memset(com, 0x00, 128);
 
 modifystr(filename);
 sprintf(com, "__align(2) static const unsigned char %s[] = {", filename);
 fputs(com, fh_out);
 putc(0x0d,fh_out);
 putc('/n',fh_out);
 /*写入数据*/
 while (n<(infileLen))
 {
  putc('0',fh_out);
  putc('x',fh_out);
  c_in=getc(fh_in);
  c=c_in;
  
  c=(c>>4)&0x0f;        //获取高四个BIT的内容
  if (c<0x0a)
  {
   c+=0x30;        //把符号转成数字
  }
  else
  {
   c+=0x37;         //转成a到f
  }
  putc(c,fh_out);
  c=c_in&0x0f;    //获取低四个BIT内容
  if (c<0x0a)
  {
   c+=0x30;
  }
  else
  {
   c+=0x37;
  }
  putc(c,fh_out);
  putc(',',fh_out);
  n++;
  
  if (num++ % 16 ==0)
  {
   putc(0x0d,fh_out);
   putc('/n',fh_out);
  }
  
  
 }
 putc('}',fh_out);
 putc(0x0d,fh_out);
 putc('/n',fh_out);
 
 memset(com, 0x00, 128);
 sprintf(com, "{%s, sizeof(%s), %d}", filename, filename, getfilevalue(getfileextname(music)));
 fputs(com, fh_out);
 putc(0x0d,fh_out);
 putc('/n',fh_out);

 fclose(fh_in);
 fclose(fh_out);
 return 0;
}
int main(int argc, char* argv[])
{
 WIN32_FIND_DATA fd;
 
 HANDLE hd=::FindFirstFile((LPCTSTR)"*.*",&fd);  //开始查找
 if(hd==INVALID_HANDLE_VALUE)
 {
  if (!isMusicFile(fd.cFileName))
   printf("没有找到文件");
  return 0;
 }
 if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
 {
  if (isMusicFile(fd.cFileName))
  {
   music2res(fd.cFileName, (char *)"resource_audio.c");
  }
 }
 while(FindNextFile(hd,&fd)) //继续查找
 {
  if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
  {
   if (isMusicFile(fd.cFileName))
   {
    music2res(fd.cFileName, (char *)"resource_audio.c");
   }
  }
 }
 FindClose(hd);//关闭查找
 return 0;
}

Flash_Tool(V5.1)使用方法: 1、打开升级平台Flash_Tool(V5.1)然后在Download Agent处点击选MTK_ALLnOne_DA.bin文件。 2、点击Scatter File选升级软件自带的scatMTK53_09A_GEMINI.txt文件。随后平台会自动调用BIN文件(升级文件)。 3、第三个是选串口,(具体查看设备管理器里的升级线安装在哪个COM口)。 4、注意Options选项里的Format FAT中选Do Not Format FAT,意思是不要格式化,否则会导致信号弱,改变参数。 5、数据备份设置 点击Options,点选Backup and Restore,选择Backup—Download/Format—Restore。 6、升级:点击Download后,按开机键,首先出现灰色条(备份数据)然后出现红条(初始化),出现蓝条时开始升级,升级完成后出现绿色条(格式化),格式化后出现灰色条(数据还原),最后提示OK。 7、格式化:点击Format后,按开机键,首先出现灰色条(备份数据)然后出现红条(初始化),格式化时出现绿色条,格式化后出现灰色条(数据还原),最后提示OK。 8、读取BIN文件(软件) 找一台开机正常的手机,利用这个平台可将所有MTK手机的软件读取出来,作为其他手机升级之用。 连接好升级线和手机,点击Read Back选项,双击下面的勾选项,会弹出一个窗口,意思是保存的路径。选好保存的路径后,点击Read Back键,按开机键即可读取字库中的数据。 9、Memory Test 字库测试,可查看字库的分区结构,检测字库有无坏区。 按START后,再按开机键即可测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值