举例说明:

此十六进制保存的文件为此源代码hexdump生成的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
dtob(int a);
int main(int argc,char **argv)
{
FILE *fp;
int a;
if((fp=fopen("1.c","r"))==NULL)
{
printf("open error\n");
}
while((a=getc(fp))!=-)
{
dtob(a);
}
printf("\n");
return ;
}
dtob(int a)
{
int i=;
int *p;
p=(int *)malloc(*sizeof(int));
while(i<)
{
if(a/ || a==)
{
*(p+i)=a%;
}
else
*(p+i)=;
a=a/;
i++;
}
for(i=;i>=;i--)
printf("%d",*(p+i));
}

此源代码的hexdump之后的文件为:

  636e 756c  733c  6f69 682e
0a3e 636e 756c 733c 6e69
2e67 3e68 230a 6e69 6c63 3c65
6c64 682e 0a3e 636e 756c
6d3c 6c61 6f6c 2e63 3e68 640a 6f74
6e69 0a3b 6e69 616d 6e69
746e 2c63 2a20
612a 7b0a 090a 454c 2a20
0a3b 746e 0a3b
3d70 6f66 286e 632e 2c22
00000a0 3d29 4e3d 4c55 294c 090a 0a7b
00000b0 6e69 706f 6e65
00000c0 726f 6e5c 0a3b 7d09 090a
00000d0 6c69 673d
00000e0 3d21 312d 0a29 7b09 090a 6f74
00000f0 0a3b 7d09 090a 6e69
6e5c 0a3b 206e 3b30
7d0a 640a 6f74 6e69 7b0a
090a 6e69 3d69 3b30 090a 6e69
702a 0a3b 283d 6e69 292a 616d
6c6c 636f 732a 7a69 6f65 6e69
3b29 090a 6c69 3c69
090a 0a7b 322f 7c20 207c
3d61 313d 0a29 0a7b 2a09
692b 3d29 3b32 090a 7d09 090a
736c 0a65 2a09 692b 3d29 3b30
00001a0 090a 613d 322f 0a3b 2b69 3b2b
00001b0 090a 0a7d 726f 373d 693b 3d3e
00001c0 3b30 2d69 292d 090a 746e
00001d0 2a2c 692b 0a3b 0a7d
00001e0

如何把此十六进制代码重新解析返回成源代码形成:

编码如#include<stdio.h>

#include<string.h>
#include<stdlib.h>
disp(char *p);
int main(int argc,char **argv)
{
FILE *fp;
char buf[],*p;
p=(char *)malloc(sizeof(buf));
if((fp=fopen("hex","r"))==NULL)
{
printf("open error!\n");
exit();
}
memset(buf,,sizeof(buf));
while(fgets(buf,sizeof(buf),fp)!=NULL)
{
if((p=strstr(buf," "))!=NULL)
p++;
disp(p);
memset(buf,,sizeof(buf));
}
return ;
}
disp(char *p)
{
char a[],b[];
memset(a,,sizeof(a));
memset(b,,sizeof(b));
while(p!=NULL)
{
sscanf(p,"%2x%2x",b,a);
printf("%s%s",a,b);
if((p=strstr(p," "))!=NULL)
{
p++;
              if(strncmp(p," ",1)==0)  
              exit(0);
                }
}
}

在IBM的AIX下:

() 3c 3f  6d 6c       6f 6e 3d    <?xml version="
() 2e 6e 6f 6e 3d ." encoding="G
() 4b 3f 3e 0a 3c 4d 3e 0a 3c BK" ?>*<Msg>**<H
() 3e 0a 3c 3e 2e 3c ead>***<Ver>1.0<
() 2f 3e 0a 3c 6e 6d /Ver>***<SndTime
() 3e 3c 2f 6e 6d 3e 0a 3c ></SndTime>***<
() 4d 4e 6f 3e 4c 3c 2f 4d MsgNo>L00101</Ms
() 4e 6f 3e 0a 3c 4e 6f 6d 6e 6b gNo>***<NomBankI
() 3e 3c 2f 4e 6f 6d 6e 6b D></NomBankI
() 3e 0a 3c 4d 3e D>***<MsgID>DHCC
(000a0) 3c 2f </
(000b0) 4d 3e 0a 3c 4f 4d MsgID>***<OrigMs
(000c0) 3e 3c 2f 4f 4d 3e gID></OrigMsgID>
(000d0) 0a 3c 2f 3e 0a 3c 6f **</Head>**<Body
(000e0) 3e 0a 3c 6e 6f 3e 0a >***<BaseInfo>**
(000f0) 3c 6e 3e 3c 2f **<TxnID></Tx
() 6e 3e 0a 3c 6e nID>****<RefTxnI
() 3e 3c 2f 6e 3e 0a D></RefTxnID>**
() 3c 6e 6e 6b 3e **<InterBankID>

解析代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
disp(char *p);
int main(int argc,char **argv)
{
FILE *fp;
char buf[],*p;
p=(char *)malloc(sizeof(buf));
if((fp=fopen("hex","r"))==NULL)
{
printf("open error!\n");
exit();
}
memset(buf,,sizeof(buf));
while(fgets(buf,sizeof(buf),fp)!=NULL)
{
if((p=strstr(buf," "))!=NULL)
{
p++;
}
disp(p);
memset(buf,,sizeof(buf));
}
return ;
}
disp(char *p)
{
char b[];
memset(b,,sizeof(b));
while(p!=NULL)
{ sscanf(p,"%hhx",b);//hhx表示一个8位的十六进制数
printf("%s",b);
if((p=strstr(p," "))!=NULL)
{
p++;
if(strncmp(p," ",)==)
{
p++;
if(strncmp(p," ",)==)
exit();
}
}
}
}

在linux下通过hexdump生成一个十六进制的文本保存文件,解析此文件转变成正常源代码文件。的更多相关文章

  1. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...

  2. Linux下动态库生成和使用

    Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...

  3. 在Linux下,如何分析一个程序达到性能瓶颈的原因

    0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...

  4. Linux系统下LNMP一键搭建Linux、PHP、MySQL环境(适合新手搭建linux下的web生成环境)

    一. 首先要解释一下,什么是LNMP,LNMP起源于LAMP,LAMP是Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的缩写,这里将Web服务端的Apache替换 ...

  5. ESP8266交叉编译器xtensa-lx106-elf 在Linux下编译与生成

    原作者:杭州_燕十三 来源:CSDN 原文:https://blog.csdn.net/flyingcys/article/details/71357261 版权声明:本文为博主原创文章,转载请附上博 ...

  6. Linux下使用openssl生成证书

    利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件. 参考:http:// ...

  7. Linux下使用vim命令编辑与修改文本内容

    输入 vim --help VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jul 26 2017 20:13:43) 用法: vim [参数] [文件 .. ...

  8. LINUX下PHP网页生成快照(截屏)(xvfb and wkhtmltoimage)

    经测试,可以使用 利用php截屏或实现网页快照我们需要用一个工具:xvfb and wkhtmltoimagek哦,这个工具目前只能在linux系统中使用,下面有兴趣的朋友可进入参考. 在做旅游攻略时 ...

  9. linux下使用openssl生成https的crt和key证书

    x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...

随机推荐

  1. IIS 发布之后 您要找的资源已被删除、已更名或暂时不可用。 404.0 解决方法

    步骤一: 如图,我发布网站后,在应用程序池中看到默认的.NetFreamork是2.0版本的,我把它改为4.0后 重新浏览网页就正常了. 如果还是不行,那么进行第二步,

  2. 有返回值的函数,如果包含try/catch块,经常会出现没有return的错误

    public static Connection getConnection(){ try { return datasource.getConnection(); } catch (SQLExcep ...

  3. C++中printf和scanf的用法

    (一)printf的用法 printf:按格式打印,向控制台输出.print:打印 ,f:formate,格式化. 在使用printf向控制台输出时,不建议使用中文字符串,中文字符串的问题比较复杂,有 ...

  4. java参数传递

    关于方法的参数传递,java中方法的参数传递均为值传递,根据传递的类型以及方法中对参数的处理可以分为2类: 1.传递参数为基本数据类型,因为是值传递,所以方法运行结束后对传递参数的值无影响. 2.传递 ...

  5. js 日期大小比较

    <!DOCTYPE HTML><html><body><script>//获取起始日期 //转换为日期格式var startDate='2016-06- ...

  6. JavaScript基础语句

    一.前言: 有过学习其他语言的经历,会比较好上手.但是,没有学过也无关大雅.只要认真学,都会学好.毕竟,都只是一些基础的语句.关键在于要会运用. 掌握好语句的嵌套,以及要的逻辑思维能力,就已经成功一大 ...

  7. 【Hadoop】 2.7.3版本 hdfs 命令行使用

    1.查看HDFS下目录结构及文件 dream361@ubuntu:~$ hdfs dfs -ls -R / 2.创建文件目录/tmp dream361@ubuntu:~$ hdfs dfs -mkdi ...

  8. find the Nth highest salary(寻找第N高薪水)

    Suppose that you are given the following simple database table called Employee that has 2 columns na ...

  9. redux源码解读

    react在做大型项目的时候,前端的数据一般会越来越复杂,状态的变化难以跟踪.无法预测,而redux可以很好的结合react使用,保证数据的单向流动,可以很好的管理整个项目的状态,但是具体来说,下面是 ...

  10. JavaScript 30 - 2 学习笔记

    学习JavaScirpt30的笔记! 有意思! 2------->   CSS clock 效果是这样的.... 这是改良过后的 版本.... 话不多说,直接来看代码. 首先是html部分 &l ...