User Tools

Site Tools


mywiki:linux:filereplace

This tool is used to replace first binary file at specified offset Binary file1, Binary file2, Final file: part of file1 + file2 + part of file1. Note: File1 file length no change.

replace_merge.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *ReadFile(char *name, int *len)
{
	FILE *file;
	char *buffer;
	unsigned long fileLen;
 
	//Open file
	file = fopen(name, "rb");
	if (!file)
	{
		fprintf(stderr, "Unable to open file %s", name);
		return NULL;
	}
 
	//Get file length
	fseek(file, 0, SEEK_END);
	fileLen=ftell(file);
	fseek(file, 0, SEEK_SET);
 
	//Allocate memory
	buffer=(char *)malloc(fileLen+1);
	if (!buffer)
	{
		fprintf(stderr, "Memory error!");
        fclose(file);
		return NULL;
	}
 
	//Read file contents into buffer
	fread(buffer, 1, fileLen, file);
	fclose(file);
 
	printf("Read %u bytes from file %s \n", fileLen, name);
 
	*len = fileLen;
	return buffer;
}
 
int WriteFile(char *name, char *buf, int len)
{
	FILE *file;
 
	//Open file
	file = fopen(name, "wb");
	if (!file)
	{
		fprintf(stderr, "Unable to create file %s", name);
		return -1;
	}
 
	//Read file contents into buffer
	fwrite(buf, len, 1, file);
	fclose(file);
	printf("Write %u bytes to file %s \n", len, name);
	return 0;
}
 
int  main(int argc, char **argv)
{
	int len1, len2, offset;
	char *buf1, *buf2;
 
	if( argc != 5) {
		printf("Usage: %s file1 file2 offset output_file\n");
		return 0;
	}
 
	buf1=ReadFile(argv[1], &len1);
	buf2=ReadFile(argv[2], &len2);
 
	if( !buf1 || !buf2) goto END;
 
	offset=atoi(argv[3]);
	printf("offset=%u\n", offset);
	if( len2+offset <= len1 ) {
		memcpy(buf1+offset, buf2, len2);
		WriteFile(argv[4], buf1, len1);
	}
	else
		printf("File1 %s is less than File2 %s + offset(%u)\n", argv[1], argv[2], offset);
 
 
END:
	if( !buf1) free(buf1);
	if( !buf2) free(buf2);
	return 0;
}
mywiki/linux/filereplace.txt · Last modified: by 127.0.0.1