C语言 分割bin文件程序

2023-11-12

/**
 ******************************************************************************
 * @file    main.c
 * @author  Earlybird
 * @version V1.0.0
 * @date    30-May-2022
 * @brief   分割bin文件为指定大小文件
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2022 INESA(Group)Co., Ltd. R&D Center.
 * All rights reserved.
 *
 ******************************************************************************
 */

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
#define RUNERROR  -1
#define RUNSUCESS 0

int cut_bin_file(char* file_addr, int file_cut_size)
{
	/* 读取bin文件类型校验 */
	if (!strstr(file_addr, ".bin"))
	{
		printf("file type incorrect, please input proper bin file.");
		return RUNERROR;
	}

	/* 要求分割块大小校验 */
	if (!file_cut_size)
	{
		printf("file cut size incorrect, please input the size greater than 0.");
		return RUNERROR;
	}

	/* 读取2进制bin文件 */
	FILE* fp_bin = fopen(file_addr, "rb");
	if (!fp_bin)
	{
		perror("fopen bin file error");
		return RUNERROR;
	}

	/* 计算bin文件总大小 */
	int file_all_size = 0;
	fseek(fp_bin, 0, SEEK_END);
	file_all_size = ftell(fp_bin);

	/* 计算分割后文件个数 */
	int file_cut_num = 0;
	file_cut_num = (file_all_size % file_cut_size) ? (file_all_size / file_cut_size) + 1 : (file_all_size / file_cut_size);

	printf("bin file size: %dB, cut file size: %dB, cut file num: %d.\n", file_all_size, file_cut_size, file_cut_num);

	/* 生成分割后新文件 */
	fseek(fp_bin, 0, SEEK_SET);

	char* file_fifo = (char*)malloc(sizeof(char) * file_cut_size); // 定义分割文件缓冲区
	char* file_cut_addr = (char*)malloc(strlen(file_addr) - 4 + 4 + 10); //定义分割文件存放地址
	char* file_name = (char*)malloc(strlen(file_addr));

	strncpy(file_name, file_addr, strlen(file_addr) - 4); // 读取源文件存放地址及名称
	file_name[strlen(file_addr) - 4] = 0;

	int file_cut_cnt = 0;
	size_t file_read_size = 0;

	while (1)
	{
		memset(file_fifo, 0, file_cut_size);
		file_read_size = fread(file_fifo, 1, file_cut_size, fp_bin);

		if (!file_read_size)
		{
			printf("cut bin file done.\n");
			break;
		}

		file_cut_cnt++;

		sprintf(file_cut_addr, "%s_%003d.bin", file_name, file_cut_cnt); // 生成分割文件存放地址
		FILE* fp_cut_bin = fopen(file_cut_addr, "wb");
		if (!fp_cut_bin)
		{
			perror("create cut file error");
			return RUNERROR;
		}
		fwrite(file_fifo, 1, file_read_size, fp_cut_bin); //写入字节数是读出来的返回值
		printf("%s, size: %zdB, create done.\n", file_cut_addr, file_read_size);
		fclose(fp_cut_bin);
	}

	fclose(fp_bin);

	free(file_fifo);
	file_fifo = NULL;

	free(file_cut_addr);
	file_cut_addr = NULL;

	free(file_name);
	file_name = NULL;

	return RUNSUCESS;
}

int main(int argc, char** argv)
{
	if (argc == 3)
	{
		cut_bin_file(argv[1], atoi(argv[2]));
	}
	else
	{
		printf("command format: cutbin.exe [file_name.bin] [cut_size]\n");
	}

	system("pause");
	return EXIT_SUCCESS;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 分割bin文件程序 的相关文章

随机推荐

  • 使用python bypy模块上传文件至百度网盘

    安装bypy pip install bypy 终端输入 bypy info 访问此url 登录备份目标网盘 将获取的授权码粘贴到命令行并回车 再次输入bypt info 出现容量信息表示成功 终端上传代码 bypy upload G Pi
  • GND_EARTH和GND的关系是什么?

    一 GND EARTH和GND的关系是什么 在电路设计中常见到GND EARTH和GND 本文讨论以下几个问题 1 什么情况下需要GND EARTH 当机壳为导体时 需要GND EARTH 2 GND和GND EARTH如何连接 图1 项目
  • 功能测试主要做什么?

    说到功能测试 大多数人都认为没技术含量 小白都能做 个人认为这是对功能测试的认知错误 1 功能测试 测试思维 测试较为重要的是要有测试思维 通常测试新手设计用例时一条需求仅能写出一两条用例 有经验的老员工设计用例时思考的会更全面 这里并不是
  • 程序员必须知道的10大基础实用算法及其讲解

    http www cricode com 2001 html
  • 几分钟带你认识vuex的五个核心属性

    目录 一 Vuex是什么 二 什么数据可以储存在vuex中呢 三 对于使用Vuex的理解是什么 四 vuex由五部分组成 五种状态 五种属性 五 安装配置 六 详解五种状态 1 state 存放公共数据 2 getters 计算属性 对st
  • 编程计算器-表达式求值(浮点数、标识符的实现)-顺序表链表实现-同维度向量运算-C语言

    include
  • Python爬虫爬取LOL所有英雄皮肤

    import requests import os import jsonpath from urllib request import urlretrieve 获取ID def get id url https game gtimg cn
  • Android开发中关于“invalid symbol”的错误

    Android开发中 有时会提示关于 invalid symbol 这个的错误 比如 error invalid symbol switch 代码如下
  • 01-12306-抓取验证码

    utf 8 import requests from bs4 import BeautifulSoup import time from PIL import Image from io import BytesIO def getIPPo
  • linux gdb调试动态库(so)的方法

    原文地址 http www gonwan com tag gdb 在本例中使用了libcurl so 4库 step1 编译libcurl so 4的可调试版本 sudo apt get source libcurl3 dbg cd cur
  • js数组reduce方法的详解

    js数组reduce方法的详解 一起来瞅瞅reduce到底是怎么个事 看到这相信已经明白了reduce的参数以及作用 下面使用reduce来解决一些问题吧 1 使用reduce进行数组求和 2 看注释需求 题目有点长 一起来瞅瞅reduce
  • VS2017下的QT框架之QModbus配置

    在QT Creater下实现Modbus通讯 需要在QT pro文件中添加serialbus模块 QT core gui sql serialbus 但是 在vs环境下没有pro文件 可能有 没找到 如何添加呢 直接 include会报红
  • Python基础-48-文本处理(逗号分隔值CSV)

    前言 python自带模块csv可以将数据以csv格式输出到文件 也可以将csv数据读回 列表 元组数据写入和读取 代码部分 coding utf 8 import csv data也可以为列表 data 1 suner001 b12345
  • Qt布局管理器

    布局管理器 利用布局管理器做出如下界面效果 标签与输入框设置伙伴关系 新建桌面应用程序 项目名TestLayout 基类QWidget 类名Widget 不勾选创建界面 include widget h include
  • ubuntu16.04.4 + cuda + cudnn + 环境变量(path)

    仅仅是总结 网上教程很多 勿喷 谢谢 时间2018年7月13日 环境 ubuntu16 04 4 注意 目前ubuntu上CUDA安装只支持该版本 64位 显卡英伟达720M 没错 很古老吧 今天一看 发现这个写的太烂了 传送门 一位大哥写
  • golang-gvm

    https mp weixin qq com s SEPP56sr16bep4C S0TLgA 详细介绍 https mp weixin qq com s biz MzAxMTA4Njc0OQ mid 2651438277 idx 4 sn
  • Android获取IMEI和MEID

    在破解微信数据库时 需要获取手机的DeviceId 但是有时会出现打不开的情况 报出file is not a database while compiling select count from sqlite master的异常 这时发现
  • linux怎么关闭超线程模式,Linux动态启用/禁用超线程技术的方法详解

    前言 intel的超线程技术能让一个物理核上并行执行两个线程 大多数情况下能提高硬件资源的利用率 增强系统性能 对于cpu密集型的数值程序 超线程技术可能会导致整体程序性能下降 鉴于此 执行OpenMP或者MPI数值程序时建议关闭超线程技术
  • “基于机器学习算法的推荐系统” 在软件静态分析领域的应用方法

    一 软件静态分析背景 软件静态分析的相当部分的内容就是发现代码中的缺陷 缺陷的形式往往五花八门 各式各样 每当发现一个缺陷 测试人员首先会感到高兴 终于抓到了一条 虫 可继而很可能会感到心虚 因为 在现有技术条件下 一条软件行业的规律是仍然
  • C语言 分割bin文件程序

    file main c author Earlybird version V1 0 0 date 30 May 2022 brief 分割bin文件为指定大小文件 attention Copyright c 2022 INESA Group