Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 将.bin程序转换成.img的软盘镜像(c语言)
【标  题】:将.bin程序转换成.img的软盘镜像(c语言)
【关键字】:.bin,.img
【来  源】:http://blog.csdn.net/xombat/archive/2006/12/26/1463686.aspx

将.bin程序转换成.img的软盘镜像(c语言)

Your Ad Here

看似很难的东西,其实很简单,只是文件的二进制打开和二进制写入,可能还会有更好的方法,我用了很普通的方法,然而却用了三个小时,如果是在大一的时候,我可能顶多用半个小时。学过的东西很多都忘了,这半天就算熟悉熟悉旧知识。老天爷很配合,测试中几乎没碰到什么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;
}
“这不是你老爸那时候的CORBA”-用于嵌入式实时系统的体系结构:【上一篇】
为什麽我的flash播放时最大化,屏幕放大了而动画为什麽还是那麽:【下一篇】
【相关文章】
  • 屏蔽CHtmlViewWebBrower控件右键菜单技巧合集_转载自http://www.binzi.net/html/vc/2006/0902/10050.html
  • 拆解和定制initrd.img
  • org.apache.tapestry.BindingException
  • WinCE NK.bin与NK.nb0
  • 个人心得:创建用于USB启动的initrd.img
  • /usr/src/usr.bin/expand/expand.c
  • [实践]NTLDR和Bootfont.bin的作用
  • romfs.img,image.rom,image.ram(1)
  • image.ram、image.rom、romfs.img(2)
  • image.rom,image.ram,romfs.img(3)
  • 【随机文章】
  • 腾讯TM2005beta1最新技巧四则
  • 实验九 静态路由实验
  • 关于/etc/security/limits的中文解释
  • Linux Server 4.3 + Apache + MySQL + Zend Optimizer
  • Emacs配置清单
  • Oracle Initialization Parameters
  • 撰稿人宝典 V1.0(4)
  • 图解利用Eclipse3+Lomboz3+Tomcat开发JSP --3.一个JSTL实例
  • 八神对挑之无敌
  • 1000本Linux Unix系统、网络、编程电子书专题下载
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.