查看任何文件的二进制码--这有何难?用C开发查看HEX字节码的工具,兼论命令行程序开发方法

本文主要是介绍查看任何文件的二进制码--这有何难?用C开发查看HEX字节码的工具,兼论命令行程序开发方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的-用C开发查看HEX字节码的工具

在windows下,要看一个文本文件的内容,可用”记事本“即可,用type file.txt 也可在命令窗显示文件内容。但是–

如果要看一个二进制文件的内部字节码,用什么工具?

你会说,有很多工具呢!例如HexViewer,百度一查一大堆!还有著名的UltraEdit直接有HEX编辑模式,在Notepad++里,下载HEX Editor插件也可完成。例如,用UltraEdit打开一个123.rar文件,显示如下。
在这里插入图片描述

用Notepad++打开,显示如下:
在这里插入图片描述
可见,HEX字符值都被显示出来。右方参考显示了有ASCII码值的字母,但两软件处理中文模式不同,所以只有字母显示是一致的,仅可做参考。
我们可能会感叹,有这些软件真方便!
那么,如果没有这些工具,我们自己编一个如何?你可能不敢想象,那得多少行程序!即使只显示字节的HEX十六进制码,能上下翻页,可查看任意位置(行)上的值,等等,也得不少代码吧?

先看要求的功能

工具名:bin2hex.exe 这是命令行程序。

(1) 帮助信息

如果我不会用,应显示程序的帮助说明。直接在命令窗口打入bin2hex

C:\>bin2hex.exe
Show HEX code of anyfile  2018 WTCLAB.NET Copyright (C)
Usage: bin2hex anyfilename
C:\>

可见程序显示了功能和用法说明。提示要带上要查看的文件名。于是再来:

(2)出错提示

如果打入的文件不存在呢?要能提示吧?

C:\>bin2hex.exe abc.ttt
file abc.ttt not found
C:\>

abc.ttt是乱打的,不存在,所以给出提示说file abc.ttt not found

(3)交互命令提示

设磁盘上有123.rar文件,打入
bin2hex.exe 123.rar则显示进入了HEX浏览环境,并提示输入操作命令提示符:

C:\>bin2hex.exe 123.rar
start at 0x00000000(0)address | 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
--------|-------------------------------------------------
00000000| 52 61 72 21 1a 07 00 cf 90 73 00 00 0d 00 00 00
00000010| 00 00 00 00 00 ec 74 c0 90 33 00 fc ac 0e 00 33
00000020| 40 5d 00 02 e1 79 72 17 49 9e 3d 4d 1d 33 0e 00
00000030| 20 00 00 00 70 69 61 6e 6f 73 74 65 72 6f 2e 64
00000040| 61 74 00 b0 a8 67 16 0c 19 4c cd 15 55 91 10 14
00000050| 15 7b ec 09 f0 7d 78 0c 50 87 ca 2f b2 fc 0e ef
00000060| c0 a7 a2 40 be 8a ba 16 05 df bf 8a 1b c9 46 66
00000070| 77 bc eb 47 81 70 12 5a 71 59 53 dd aa 02 45 46
00000080| 77 9c 65 b6 9a e0 28 a2 70 4a 51 ff 87 26 fe 4d
00000090| fc 9b c2 6f 01 12 51 27 18 c3 84 84 15 dd ff bf
000000a0| eb ff af f5 ff f3 ff df fb ff b7 eb ff 9f f5 ff
000000b0| ff fe 0c b2 f7 9e df e9 ff b7 f6 9f fc 7f f7 fe
000000c0| bf f8 ff c7 fb 7f df ff ef d6 7f f3 7f 4f ff 7b
000000d0| fd 7d 2f be df 33 07 5f f6 f7 c7 d9 9d 6b cf fb
000000e0| 7a f7 ef 60 fc 7a d3 fc 06 d9 71 b7 1f 52 bd 1f
000000f0| 7f da 7f b9 97 39 6b fd 8f 43 fe 28 e7 3e 33 fd
your last command code is   (ASCII 0)
command key: q(uit)  u(p)↑  d(own)↓  s(tart) e(nd) g(o lines) n(o messages)
new command >

对比一下工具软件显示结果,完全相同。

命令窗截图如下:

还给出了操作命令提示:用q退出。用u或上箭头翻一页,用d或下箭头翻到下一页,每页显示16行,每行16个字节,共16*16=256字节信息。用e滚到文件结束处,用s回到文件头(这可能比Notepad++或UtraEdit都方便)。

(4)简单而美观的用户界面

为了美观,屏幕也可处理为白底黑字的。

(5)用户交互命令

如果文件较长,为了查看任意位置,来回翻页岂不是很麻烦?所以,打g命令,然后输入要查看的位置,即转了过去:
如图打入g后,将提示address(HEX)? Example:0x1024 >0x,在其后可输入地址,如2000,即从0x2000位置查看:
在这里插入图片描述

回车后得:


可见地址起于0x2000了。

可见,软件采用了命令交互模式,提示输入的命令有7个。

  • q 退出
  • u 或 ↑ 向上翻页
  • d 或 ↓ 向下翻页
  • s 回到文件头
  • e 到文件尾
  • g 到任意位置
  • n(o messages) 静默模式

命令虽然简单,但形式与Python、Matlab、gnuplot等的提示窗风格相同,初步具有一个简单交互软件的形式了。

(6)静默模式

软件在每次交互后都会提示命令操作,这是为了方便初次使用的人。但如果老这样提示,也会使人心烦吧? UNIX和LINUX提倡沉默是金,因此,我们也搞了一个安静模式作为演示。打入n后进入安静模式。

如图:
在这里插入图片描述
安静模式下,也使用同样命令翻页(u,d),导航(g),以ESC退出安静模式,进入常规模式。
在这里插入图片描述

(7) 退出

  • ESC键退回常规模式。
  • 任何模式下,用 q 退出软件。
    打入q后,又回到了命令窗。
    在这里插入图片描述

多少代码量?

你想不到吧?如此功能的程序,我只用了113行C代码。当然这不是最优化的。抛砖。

程序中仅使用了最普通的C函数,做二进制文件的读。

  • rewind
  • fseek
  • fread

剩下就是循环和输入输出语句了。但程序结构是命令行程序最经典的方法。

源码 (bin2hex.c)

在tiny CC或gcc下编译。

C:\>gcc bin2hex.c -o  bin2hex.exeC:\>
或
C:\>tcc bin2hex.c -o  bin2hex.exe
都可。
也可用VC6.0编译:
C:\>cl bin2hex.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.bin2hex.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved./out:bin2hex.exe
bin2hex.obj

bin2hex.c 源码:

//bin2hex.c
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main(int argc, char *argv[])
{unsigned char c;//记录单字符int len,i,flag;//记录chunk长度,循环变量int commandchar=0;//命令字long addr;//偏移量int nomessages=0;//为1则启用安静模式long fileend;//记录文件尾位置备用FILE *fp;if(argc<2){printf("Show HEX code of anyfile  2018 WTCLAB.NET Copyright (C)\n");printf("Usage: bin2hex anyfilename");return 0;}fp=fopen(argv[1],"rb");if(fp==NULL){printf("file %s not found\n",argv[1]);return 0;}fileend=fseek(fp,0,2);rewind(fp);//重回文件开始处len=16*16;//每次输出长度16行,每行16字节system("color f0"); //窗口白底黑字while(1){//打印二进数据内容表if(nomessages==0)//输出标准模式消息{printf("start at 0x%08x(%ld)\n",ftell(fp),ftell(fp));printf("\naddress | 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n");printf("--------|-------------------------------------------------");}for(i=0; i<len; i++)//输出len个字节,16个为一行{fread(&c,1,1,fp);if(feof(fp)!=0){break;} //读到文件尾就结束if((i)%16 == 0){printf("\n%08x| %02x ",ftell(fp)-1,c); //每行打16个字节,换行}else{printf("%02x ",c);//按16进制输出读入的字节值}}if(nomessages==0)//输出标准模式消息{printf("\nyour last command code is %c (ASCII %d)\n",commandchar,commandchar);//输出键盘消息字符和对应的ASCII值printf("command key: q(uit)  u(p)↑  d(own)↓  s(tart) e(nd) g(o lines)\n(o messages)\n");//输出命令提示printf("new command > ");}//输出安静模式消息else{printf("[esc]> ");}commandchar=getch();//接收控制命令并执行if(commandchar=='q'){break;}else if(commandchar=='u' | commandchar==72)//键盘u或上箭头{if(ftell(fp)>(2*16)*16){fseek(fp,-(2*16)*16,1);//指针回卷32行,到上一屏位置}else{rewind(fp);//指针回文件头}}else if(commandchar=='d' | commandchar==80)//键盘d或下箭头{//直接到下一屏位置。即fseek(fp,0,1);}else if(commandchar=='s')//键盘s:回文件头{rewind(fp);}else if(commandchar=='e')//键盘e:至文件尾{fseek(fp,-16*16,2);//到文件尾,回溯16行输出}else if(commandchar=='g')//键盘g:输入开始行地址{printf("\naddress(HEX)? Example:0x1024 > 0x");scanf("%x",&addr);fseek(fp,addr,0);}else if(commandchar=='n')//键盘n:静默模式:不显示提示{nomessages=1;printf("\n Silence Mode now!\nESC return to normal mode");}else if(commandchar==27)//键盘ESC:回到显示提示模式{nomessages=0;fseek(fp,-16*16,1); //显示不动:回16行重打出来}else{fseek(fp,-16*16,1); //其他键:显示不动:回16行重打出来}}fclose(fp);system("color 07");return 0;
}

这篇关于查看任何文件的二进制码--这有何难?用C开发查看HEX字节码的工具,兼论命令行程序开发方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412747

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操