最近又在读《Orange's》发现作者推荐的软盘烧录器在win10 下不能运行。懒得找其他的,也刚好复习一下C,就写了一个极简单的实现。
其实就是把文件以二进制的形式原封不动地拷贝到*.img,不足的部分用0x00 填充。
#include <stdio.h>
#include <string.h>
void menu(void)
{
printf(
"write binary file to image file or floppy\n \
using:\n \
bin2img [-i input] [-o output]\n \
-i:binary file input\n \
-o:image file output\n \
eg:\n \
bin2img -i boot.bin -o boot.img\n \
bin2img -i boot.bin\n");
}
// argc 一般至少为1,因为程序名也会算做参数
int main(int argc, char* argv[])
{
const char* input_file_name = "boot.bin";
const char* output_file_name = "boot.img";
int open_file_result = 1,
img_size = 1440 * 1024,
bin_size = 0,
eof = 0;
char buffer[512] = {0};
FILE *bin,
*img;
// 处理参数
for (unsigned int i = 1; i < (argc - 1); i += 2)
{
if (strcmp(argv[i], "-i") == 0)
{
input_file_name = argv[i + 1];
}
if (strcmp(argv[i], "-o") == 0)
{
output_file_name = argv[i + 1];
}
}
// 尝试打开bin文件
open_file_result = fopen_s(&bin, input_file_name, "rb");
if (open_file_result != 0)
{
printf("can not open file:%s\n\n", input_file_name);
menu();
return 0;
}
// 尝试读取文件长度
// fseek(bin, 0L, SEEK_END);
// bin_size = ftell(bin);
// fseek(bin, 0L, SEEK_SET);
// 尝试创建输出文件
open_file_result = fopen_s(&img, output_file_name, "wb");
if (open_file_result != 0)
{
printf("can not create file:%s\n\n", output_file_name);
menu();
return 0;
}
// 读取bin 文件并输出至img
for (int j = 0; j < img_size; j += 512)
{
if (!eof)
{
int count = fread_s(buffer, 512, sizeof(char), 512, bin);
fwrite(buffer, sizeof(char), 512, img);
// 一般bin文件会比
if (count == 0)
{
fclose(bin);
eof = 1;
}
memset(buffer, '\0', sizeof(buffer));
}
else
{
fwrite(buffer, sizeof(char), 512, img);
}
}
if (!eof)
{
// 如果bin 文件过大,则截断
printf("warning:input file is too large!\n");
fclose(bin);
}
fclose(img);
printf("generate %s successfully\n", output_file_name);
return 0;
}
可执行程序下载:https://github.com/12Tall/bin2img/releases/download/v0.1/bin2img.zip