软讯网络 > 编程语言 > C/C++ > 将.bin程序转换成.img的软盘镜像(c语言)
【标 题】:将.bin程序转换成.img的软盘镜像(c语言)
【关键字】:
.bin,.img
【来 源】:http://blog.csdn.net/xombat/archive/2006/12/26/1463686.aspx
将.bin程序转换成.img的软盘镜像(c语言)
看似很难的东西,其实很简单,只是文件的二进制打开和二进制写入,可能还会有更好的方法,我用了很普通的方法,然而却用了三个小时,如果是在大一的时候,我可能顶多用半个小时。学过的东西很多都忘了,这半天就算熟悉熟悉旧知识。老天爷很配合,测试中几乎没碰到什么bug。
一下为c语言代码:
#define BLOCK_SIZE 1024
#define SEGMENT 16
#define BLOCK_NUM 1440
#define FILE_NAME_LENTH 20 //文件名最长为20bytes
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int bytes=0; //读到内存的字节数
int bk_cnt=0; //写到img中的块数,与1440比较避免写入.img中的数据大于1440KB
int i=0;
char block[BLOCK_SIZE];
char binfile[FILE_NAME_LENTH]="boot.bin"; //默认的.bin文件名,最长20字节
char imgfile[FILE_NAME_LENTH]="Tinix.img"; //默认的.img文件名
FILE *bin_fp=0;
FILE *img_fp=0;
//如果没有参数,就按照默认方法作:即把文件看作boot.bin,扩展成Tinix.img文件
switch(argc)
{
case 1:
break;
case 3:
strcpy(binfile,argv[1]);
strcpy(imgfile,argv[2]);
break;
default:
printf("Incorrect parameters!\n");
getch();
exit(5);
}
//打开要转换的.bin文件
if((bin_fp=fopen(binfile,"rb"))==NULL)
{
printf("Cannot open the %s file!\n",binfile);
getch();
exit(1);
}
//创建.img文件
if((img_fp=fopen(imgfile,"wb"))==NULL)
{
printf("Cannot creat the %s file!\n",imgfile);
getch();
exit(2);
}
//向.img文件中填充一些任意的二进制数据
// rewind(img_fp);
// for(int i=0;i<BLOCK_NUM;i++)
while(i<BLOCK_NUM)
{
if(fwrite(block,BLOCK_SIZE/SEGMENT,SEGMENT,img_fp)!=SEGMENT)
{
printf("Failur in creating the 1440K img");
getch();
exit(3);
}
i++;
}
//将.bin文件中的二进制数据按原样拷贝到.img文件中,覆盖掉原来的前512b内容
rewind(bin_fp);
rewind(img_fp);
do{
bytes=fread(block,sizeof(char),BLOCK_SIZE,bin_fp);
bk_cnt++;
if(bk_cnt>=BLOCK_NUM)
{
printf("Err:The sourcecode is too large to store in the floppy!");
exit(4);
}
fwrite(block,BLOCK_SIZE/SEGMENT,SEGMENT,img_fp);
if(bytes<BLOCK_SIZE)
break;
}while(1);
//收拾残局:关闭文件,释放内存等
fclose(img_fp);
fclose(bin_fp);
getch();
return 0;
}