您的位置:首页 > 其它

任意二进制文件和十六进制相互转化工具

2009-04-06 11:49 204 查看
/*========================================================*/
/*
RainLeaf 文件转化工具 [版本 1.0]/n(C) 版权所有 2008-2009 R.L Studio.
功能:将一个文件转化为十六进制文件,或者将一个十六进制文件转化为二进制文件
条件:输入文件必须存在
方法:CONVERTFILE [-h | -f]
CONVERTFILE -h :将输入二进制文件转化为十六进制文件
CONVERTFILE -f :将输入十六进制文件转化为二进制文件
------------------------------------------------------------
Compiler:
Visual C++ 6.0
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char GetIndex(char sour);
int HexToFile();
int FileToHex();
int IsHex(char sour);

/*========================================================*/
/*
主函数
*/
int main(int argc,char **argv)
{
char ch[30];

if(argc < 2 || argc > 2)
{
printf("RainLeaf 文件转化工具 [版本 1.0]/n(C) 版权所有 2008-2009 R.L Studio./n/n");
printf("功能:将一个文件转化为十六进制文件,或者将一个十六进制文件转化为二进制文件/n");
printf("条件:输入文件必须存在/n");
printf("方法:CONVERTFILE [-h | -f]/n/n");
printf("CONVERTFILE -h :将输入二进制文件转化为十六进制文件/n");
printf("CONVERTFILE -f :将输入十六进制文件转化为二进制文件/n/n");
return 0;
}
strcpy(ch,argv[argc-1]);
switch (ch[1])
{
case 'h':;
case 'H':FileToHex();break;
case 'f':;
case 'F':HexToFile();break;
default:printf("输入参数错误,请直接输入命令查看帮助./n");break;
}
return 0;
}

/*========================================================*/
/*
功能:二进制文件转化位十六进制文件
参数:无
返回:成功:0;失败:-1
*/
int FileToHex()
{
FILE *input;
FILE *output;
char infile[30],outfile[30];
unsigned char temp;
char high,low;

printf("输入文件名:");
gets(infile);
printf("输出文件名:");
gets(outfile);

if((input = fopen(infile,"rb")) == NULL || (output = fopen(outfile,"w")) == NULL)
{
return -1;
}

temp = fgetc(input);
while(!feof(input))
{
low = temp & 0x0F;
high = temp >> 4;
fprintf(output,"%x%x",high,low);
temp = fgetc(input);
}
printf("二进制文件%s成功转化位十六进制文件%s.",infile,outfile);
fclose(input);
fclose(output);
return 0;
}

/*========================================================*/
/*
功能:十六进制文件转化位二进制文件
参数:无
返回:成功:0;失败:-1
*/
int HexToFile()
{
FILE *input;
FILE *output;
FILE *Temp;
char infile[30],outfile[30];
unsigned char temp;
unsigned char high,low;

printf("输入文件名:");
gets(infile);
printf("输出文件名:");
gets(outfile);

if((input = fopen(infile,"r")) == NULL || (Temp = fopen("$$","w")) == NULL)
{
return -1;
}

/* 过滤源十六进制文件 */
temp = fgetc(input);
while(!feof(input))
{
if(IsHex(temp))
{
fputc(temp,Temp);
temp = fgetc(input);
}
else
temp = fgetc(input);
}

fclose(input);
fclose(Temp);

if((input = fopen("$$","r")) == NULL || (output = fopen(outfile,"wb")) == NULL)
{
return -1;
}

high = fgetc(input);
low = fgetc(input);
while(!feof(input))
{
high = GetIndex(high);
low = GetIndex(low);
if(high == -1 || low == -1)
return -1;
high = high << 4;
temp = high | low;
fputc(temp,output);
high = fgetc(input);
low = fgetc(input);

}
printf("十六进制文件%s成功转化位二进制文件%s.",infile,outfile);
fclose(input);
fclose(output);
/* 删除临时文件 */
remove("$$");

return 0;
}

/*========================================================*/
/*
功能:取得传入字符的索引值,也就是对应的二进制
参数:字符(0~f)
返回:成功:0~15;失败:-1
*/
char GetIndex(char sour)
{
int i;
unsigned char *hex = "0123456789";

for(i = 0;i < strlen(hex);i++)
if(hex[i] == sour)
return i;
i = (sour == 'a'||sour == 'A')?10:((sour == 'b'||sour == 'B')?11:((sour == 'c'||sour == 'C')?12:((sour == 'd'||sour == 'D')?13:((sour == 'e'||sour == 'E')?14:((sour == 'f'||sour == 'F')?15:-1)))));
return i;
}

/*========================================================*/
/*
功能:判断字符是否是十六进制合法字符
参数:字符(0~f)
返回:成功:1~16;失败:0
*/
int IsHex(char sour)
{
int i;
unsigned char *hex = "0123456789";

for(i = 0;i < strlen(hex);i++)
if(hex[i] == sour)
return i+1;
i = (sour == 'a'||sour == 'A')?10:((sour == 'b'||sour == 'B')?11:((sour == 'c'||sour == 'C')?12:((sour == 'd'||sour == 'D')?13:((sour == 'e'||sour == 'E')?14:((sour == 'f'||sour == 'F')?15:-1)))));

return (i+1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: