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

本文介绍了一款用于MTK平台的铃声转换工具,能够将多种格式的音乐文件转换为C语言数组形式,便于嵌入式设备使用。通过简单的命令行操作即可完成转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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后,再按开机键即可测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值