?? viewbin.c
字號:
#include <stdio.h>
#include <stdlib.h>
#define BIN_SYNC 'B'
#define ERR_OPENFILE 1
#define ERR_READFILE 2
#define ERR_FILETYPE 3
#define ERR_ALLOCMEM 4
#define ERR_NOERR 5
#ifdef N1
typedef struct _BIN_IMAGE_HEADER{
unsigned char sync[7];
unsigned long addr;
unsigned long length;
}BIN_IMAGE_HEADER;
typedef struct _BIN_SECTION{
unsigned long addr;
unsigned long length;
unsigned long checksum;
}BIN_SECTION;
void operating_error(FILE* fp_err, int code)
{
switch(code){
default:
fprintf(fp_err,"Unknown error has occurred.\n");
break;
case ERR_OPENFILE:
fprintf(fp_err,"Open file error.\n");
break;
case ERR_READFILE:
fprintf(fp_err,"Read file error.\n");
break;
case ERR_FILETYPE:
break;
case ERR_ALLOCMEM:
fprintf(fp_err,"allocate memory error.\n");
break;
case ERR_NOERR:
fprintf(fp_err,"no error.\n");
break;
}
}
void usage(FILE* fp_err)
{
fprintf(fp_err,"expbin.exe <infile> [outfile] [errfile]\n");
fprintf(fp_err,"Notes:\n");
fprintf(fp_err,"\tinfile : input file for parsing\n");
fprintf(fp_err,"\toutfile: output file for saving results.\n");
fprintf(fp_err,"\terrfile: error file for handling error message.\n");
fprintf(fp_err,"\tCopyright by Carl.Ge 2006,May 8 in China.\n");
}
int main(int argc, char** argv)
{
FILE *fp_out = stdout,
*fp_in = stdin,
*fp_err = stderr;
unsigned char *section_buffer = 0;
BIN_IMAGE_HEADER image_header;
BIN_SECTION section_header;
unsigned long order = 0;
int is_legal = 0;
switch(argc){
default:
break;
case 2:
/* one file, it is for input */
is_legal = 1;
fp_in = fopen(argv[1],"r");
break;
case 3:
/* two files, input and output */
is_legal = 1;
fp_in = fopen(argv[1],"r");
fp_out = fopen(argv[2],"w+");
break;
case 4:
/* three files, input, output and error*/
is_legal = 1;
fp_in = fopen(argv[1],"r+b");
fp_out = fopen(argv[2],"w+");
fp_err = fopen(argv[3],"w+");
break;
}
if(!is_legal){
usage(fp_err);
return -1;
}
if((!fp_in ) || (!fp_out) || (!fp_err) ){
operating_error(fp_err,ERR_OPENFILE);
return -1;
}
fread(&image_header, 8 + 7, 1, fp_in);
fprintf(fp_out, "File Name :%s\n"
"Image Address:%08X\n"
"Image Length :%08X\n",
argv[1],
image_header.addr,
image_header.length);
/* certify its header. */
if((unsigned char)image_header.sync[0] != BIN_SYNC){
operating_error(fp_err,ERR_FILETYPE);
fclose(fp_in);
fclose(fp_out);
fclose(fp_err);
return -1;
}
while(!feof(fp_in)){
/* read each section. */
fread(§ion_header, 12, 1, fp_in);
fprintf(fp_out,"%d(s):\n"
"\tStart Address :%08X\n"
"\tSection Length:%08X\n"
"\tCheck sum :%08X\n",
++order,
section_header.addr,
section_header.length,
section_header.checksum);
section_buffer = new unsigned char[section_header.length];
if(!section_buffer){
operating_error(fp_err,ERR_ALLOCMEM);
fclose(fp_in);
fclose(fp_out);
fclose(fp_err);
return -1;
}
/* read context. */
fread(section_buffer, section_header.length, 1, fp_in);
delete [] section_buffer;
}
fclose(fp_in);
fclose(fp_out);
fclose(fp_err);
return 0;
}
#else
typedef char CHAR;
typedef unsigned char UCHAR;
typedef unsigned long ULONG;
typedef char* PCHAR;
typedef unsigned long* PULONG;
//////////////////////////////////////////
//
// BIN image and record headers
//
#pragma pack(1)
typedef struct // Image header (one per BIN image)
{
CHAR SyncBytes[7];
ULONG ImageAddr;
ULONG ImageLen;
} IMAGEHDR, *PIMAGEHDR;
#pragma pack(1)
typedef struct // Record header (one per section in image)
{
ULONG RecordAddr;
ULONG RecordLen;
ULONG RecordChksum;
} RECORDHDR, *PRECORDHDR;
void operating_error(FILE* fp_err, int code)
{
switch(code){
default:
fprintf(fp_err,"Unknown error has occurred.\n");
break;
case ERR_OPENFILE:
fprintf(fp_err,"Open file error.\n");
break;
case ERR_READFILE:
fprintf(fp_err,"Read file error.\n");
break;
case ERR_FILETYPE:
fprintf(fp_err,"wrong input file type.\n");
break;
case ERR_ALLOCMEM:
fprintf(fp_err,"allocate memory error.\n");
break;
case ERR_NOERR:
fprintf(fp_err,"no error.\n");
break;
}
}
void usage(FILE* fp_err)
{
fprintf(fp_err,"expbin.exe <infile> [outfile] [errfile]\n");
fprintf(fp_err,"Notes:\n");
fprintf(fp_err,"\tinfile : input file for parsing\n");
fprintf(fp_err,"\toutfile: output file for saving results.\n");
fprintf(fp_err,"\terrfile: error file for handling error message.\n");
fprintf(fp_err,"\tCopyright by Carl.Ge 2006,May 8 in China.\n");
}
//
// Load a BIN file into memory and jump to the start address.
//
int LoadBINFile(PULONG pImageLoc, FILE* fp_in, FILE* fp_out, FILE* fp_err)
{
IMAGEHDR ImageHdr;
RECORDHDR RecordHdr;
PCHAR cBuffer = 0;
fseek(fp_in, 0, SEEK_SET);
//
// Check callers arguments
//
if (!pImageLoc)
return 0;
*pImageLoc = 0;
//
// Read the BIN file header
//
if(fread((PCHAR)&ImageHdr, 1, sizeof(IMAGEHDR), fp_in) != sizeof(IMAGEHDR)){
return 0;
}
//
// Display image header
//
#if 1
fprintf(fp_out, "\r\nImage Header:\r\n");
fprintf(fp_out, "------------------------------------------------\r\n");
fprintf(fp_out, "Sync Bytes ................. '%c%c%c%c%c%c'\r\n", ImageHdr.SyncBytes[0], ImageHdr.SyncBytes[1], ImageHdr.SyncBytes[2], ImageHdr.SyncBytes[3], ImageHdr.SyncBytes[4], ImageHdr.SyncBytes[5]);
fprintf(fp_out, "Image Address .............. 0x%08X\r\n", ImageHdr.ImageAddr);
fprintf(fp_out, "Image Length ............... 0x%08X\r\n", ImageHdr.ImageLen);
#endif // 0.
do
{
//
// Read the next BIN file record header
//
if(fread((PCHAR)&RecordHdr, 1, sizeof(RECORDHDR), fp_in) != sizeof(RECORDHDR)){
*pImageLoc = RecordHdr.RecordLen;
break;
}
//
// Last Header?
//
if (RecordHdr.RecordAddr == 0 && RecordHdr.RecordChksum == 0)
{
// The last record header contains the image start address (in the length field).
//
*pImageLoc = RecordHdr.RecordLen;
break;
}
//
// Display Record Header
//
#if 1
fprintf(fp_out, "Record Header:\r\n");
fprintf(fp_out, "------------------------------------------------\r\n");
fprintf(fp_out, "Record Address ...................... 0x%08X\r\n", RecordHdr.RecordAddr);
fprintf(fp_out, "Record Length ....................... 0x%08X\r\n", RecordHdr.RecordLen);
fprintf(fp_out, "Record CheckSum ..................... 0x%08X\r\n", RecordHdr.RecordChksum);
#endif // 0.
cBuffer = new char[RecordHdr.RecordLen];
if(!cBuffer)
break;
//
// Read the entire record into RAM.
//
fread((PCHAR)cBuffer, 1, RecordHdr.RecordLen, fp_in);
delete [] cBuffer;
}
while(!feof(fp_in));
return 1;
}
int main(int argc, char** argv)
{
FILE *fp_out = stdout,
*fp_in = stdin,
*fp_err = stderr;
unsigned long start_addr = 0;
int is_legal = 0;
switch(argc){
default:
break;
case 2:
/* one file, it is for input */
is_legal = 1;
fp_in = fopen(argv[1],"r");
break;
case 3:
/* two files, input and output */
is_legal = 1;
fp_in = fopen(argv[1],"r");
fp_out = fopen(argv[2],"w+");
break;
case 4:
/* three files, input, output and error*/
is_legal = 1;
fp_in = fopen(argv[1],"r+b");
fp_out = fopen(argv[2],"w+");
fp_err = fopen(argv[3],"w+");
break;
}
if(!is_legal){
usage(fp_err);
return -1;
}
if((!fp_in ) || (!fp_out) || (!fp_err) ){
operating_error(fp_err,ERR_OPENFILE);
return -1;
}
if(LoadBINFile(&start_addr,fp_in,fp_out,fp_err) == 1){
fprintf(fp_out, "Start address :0x%08X\n",start_addr);
}
else
operating_error(fp_err,0);
fclose(fp_in);
fclose(fp_out);
fclose(fp_err);
return 0;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -