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

  1. /*========================================================*/  
  2. /* 
  3. RainLeaf 文件转化工具 [版本 1.0]/n(C) 版权所有 2008-2009 R.L Studio. 
  4. 功能:将一个文件转化为十六进制文件,或者将一个十六进制文件转化为二进制文件 
  5. 条件:输入文件必须存在 
  6. 方法:CONVERTFILE [-h | -f] 
  7. CONVERTFILE -h :将输入二进制文件转化为十六进制文件 
  8. CONVERTFILE -f :将输入十六进制文件转化为二进制文件 
  9. ------------------------------------------------------------ 
  10. Compiler: 
  11. Visual C++ 6.0 
  12. */  
  13.   
  14. #include <stdio.h>  
  15. #include <stdlib.h>  
  16. #include <string.h>  
  17.   
  18. char GetIndex(char sour);  
  19. int HexToFile();  
  20. int FileToHex();  
  21. int IsHex(char sour);  
  22.   
  23. /*========================================================*/  
  24. /* 
  25. 主函数 
  26. */  
  27. int main(int argc,char **argv)  
  28. {  
  29.     char ch[30];  
  30.   
  31.     if(argc < 2 || argc > 2)  
  32.     {  
  33.         printf("RainLeaf 文件转化工具 [版本 1.0]/n(C) 版权所有 2008-2009 R.L Studio./n/n");  
  34.         printf("功能:将一个文件转化为十六进制文件,或者将一个十六进制文件转化为二进制文件/n");  
  35.         printf("条件:输入文件必须存在/n");  
  36.         printf("方法:CONVERTFILE [-h | -f]/n/n");  
  37.         printf("CONVERTFILE -h :将输入二进制文件转化为十六进制文件/n");  
  38.         printf("CONVERTFILE -f :将输入十六进制文件转化为二进制文件/n/n");  
  39.         return 0;  
  40.     }  
  41.     strcpy(ch,argv[argc-1]);  
  42.     switch (ch[1])  
  43.     {  
  44.     case 'h':;  
  45.     case 'H':FileToHex();break;  
  46.     case 'f':;  
  47.     case 'F':HexToFile();break;  
  48.     default:printf("输入参数错误,请直接输入命令查看帮助./n");break;  
  49.     }  
  50.     return 0;  
  51. }  
  52.   
  53. /*========================================================*/  
  54. /* 
  55. 功能:二进制文件转化位十六进制文件 
  56. 参数:无 
  57. 返回:成功:0;失败:-1 
  58. */  
  59. int FileToHex()  
  60. {  
  61.     FILE *input;  
  62.     FILE *output;  
  63.     char infile[30],outfile[30];  
  64.     unsigned char temp;  
  65.     char high,low;  
  66.   
  67.     printf("输入文件名:");  
  68.     gets(infile);  
  69.     printf("输出文件名:");  
  70.     gets(outfile);  
  71.       
  72.     if((input = fopen(infile,"rb")) == NULL || (output = fopen(outfile,"w")) == NULL)  
  73.     {  
  74.         return -1;  
  75.     }  
  76.   
  77.     temp = fgetc(input);  
  78.     while(!feof(input))  
  79.     {  
  80.         low = temp & 0x0F;  
  81.         high = temp >> 4;  
  82.         fprintf(output,"%x%x",high,low);  
  83.         temp = fgetc(input);  
  84.     }  
  85.     printf("二进制文件%s成功转化位十六进制文件%s.",infile,outfile);  
  86.     fclose(input);  
  87.     fclose(output);  
  88.     return 0;  
  89. }  
  90.   
  91. /*========================================================*/  
  92. /* 
  93. 功能:十六进制文件转化位二进制文件 
  94. 参数:无 
  95. 返回:成功:0;失败:-1 
  96. */  
  97. int HexToFile()  
  98. {  
  99.     FILE *input;  
  100.     FILE *output;  
  101.     FILE *Temp;  
  102.     char infile[30],outfile[30];  
  103.     unsigned char temp;  
  104.     unsigned char high,low;  
  105.   
  106.     printf("输入文件名:");  
  107.     gets(infile);  
  108.     printf("输出文件名:");  
  109.     gets(outfile);  
  110.       
  111.     if((input = fopen(infile,"r")) == NULL || (Temp = fopen("$$","w")) == NULL)  
  112.     {  
  113.         return -1;  
  114.     }  
  115.   
  116.     /* 过滤源十六进制文件 */  
  117.     temp = fgetc(input);  
  118.     while(!feof(input))  
  119.     {  
  120.         if(IsHex(temp))  
  121.         {  
  122.             fputc(temp,Temp);  
  123.             temp = fgetc(input);  
  124.         }  
  125.         else  
  126.             temp = fgetc(input);  
  127.     }  
  128.   
  129.     fclose(input);  
  130.     fclose(Temp);  
  131.   
  132.     if((input = fopen("$$","r")) == NULL || (output = fopen(outfile,"wb")) == NULL)  
  133.     {  
  134.         return -1;  
  135.     }  
  136.   
  137.     high = fgetc(input);  
  138.     low = fgetc(input);  
  139.     while(!feof(input))  
  140.     {  
  141.         high = GetIndex(high);        
  142.         low = GetIndex(low);  
  143.         if(high == -1 || low == -1)  
  144.             return -1;  
  145.         high = high << 4;  
  146.         temp = high | low;  
  147.         fputc(temp,output);  
  148.         high = fgetc(input);  
  149.         low = fgetc(input);  
  150.           
  151.     }  
  152.     printf("十六进制文件%s成功转化位二进制文件%s.",infile,outfile);  
  153.     fclose(input);  
  154.     fclose(output);  
  155.     /* 删除临时文件 */  
  156.     remove("$$");  
  157.   
  158.     return 0;  
  159. }  
  160.   
  161. /*========================================================*/  
  162. /* 
  163. 功能:取得传入字符的索引值,也就是对应的二进制 
  164. 参数:字符(0~f) 
  165. 返回:成功:0~15;失败:-1 
  166. */  
  167. char GetIndex(char sour)  
  168. {  
  169.     int i;  
  170.     unsigned char *hex = "0123456789";  
  171.   
  172.   
  173.     for(i = 0;i < strlen(hex);i++)  
  174.         if(hex[i] == sour)  
  175.             return i;  
  176.     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)))));  
  177.     return i;  
  178. }  
  179.   
  180. /*========================================================*/  
  181. /* 
  182. 功能:判断字符是否是十六进制合法字符 
  183. 参数:字符(0~f) 
  184. 返回:成功:1~16;失败:0 
  185. */  
  186. int IsHex(char sour)  
  187. {  
  188.     int i;  
  189.     unsigned char *hex = "0123456789";  
  190.   
  191.   
  192.     for(i = 0;i < strlen(hex);i++)  
  193.         if(hex[i] == sour)  
  194.             return i+1;  
  195.     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)))));  
  196.   
  197.     return (i+1);  

转载于:https://www.cnblogs.com/qunxuan/p/4705007.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值