1. 程式人生 > >檢視任何檔案的二進位制碼--這有何難?用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.exe

C:\>
或
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位元組工具命令程式開發方法

目的-用C開發檢視HEX位元組碼的工具 在windows下,要看一個文字檔案的內容,可用”記事本“即可,用type file.txt 也可在命令窗顯示檔案內容。但是– 如果要看一個二進位制檔案的內部位元組碼,用什麼工具? 你會說,有很多工具呢!例如HexView

MySQL的索引為什麼B+Tree?InnDB的資料儲存檔案和MyISAM的不同?

### 前言 這篇文章的題目,是我真實在面試過程中遇到的問題,某網際網路眾籌公司在考察面試者MySQL相關知識的第一個問題,我當時還是比較懵的,沒想到這年輕人不講武德,不按套路出牌,一般的問MySQL的相關知識的時候,不都是問索引優化以及索引失效等相關問題嗎?怎麼還出來了,儲存檔案的不同?哪怕考察個MVCC機

靜態代塊在時調

output adc pri param string rate print [] con 概括的說:靜態代碼塊在類加載時調用,並且只調用一次。靜態代碼塊最常用的作用就是:給一個對象的屬性初始化。具體的說:1.當調用一個類的靜態變量時,這個類中的靜態代碼塊會執行。【只有靜態

Python任意指定下載網易雲歌曲做個專屬播放器

                  學習Python中有不明白推薦加入交流群                

C語言開發檢視HEX位元組工具--看程式如何進化

昨日所作的檢視HEX位元組碼程式,雖然不完善,但程式碼量的確很小。其中核心程式碼不過十行上下,其餘還都是例行公事,如開啟檔案,檢查輸入命令並跳轉執行的。 現在,我再增加數行程式碼,使之在介面和功能上接近UltraEdit或Notepad++的顯示,甚至更強!對於

sqlserver 運行正則表達式調c# 函數、代

exp pan net hit ng- 創建 val put creat --1.新建SqlServerExt項目,編寫 C# 方法生成 SqlServerExt.dll 文件 using System; using System.Data; usin

git 上傳一個空檔案的解決方案可使用命令建立.gitkeep檔案

什麼是.gitkeep .gitkeep是一個約定俗成的檔名並沒有什麼特殊規則, 它就相當於一個佔位,0位元組。那它有什麼用呢?當你提交提交,目錄中有空資料夾的時候,git會自動忽略掉,而有時候你就

讓天下沒有的資料庫 » 檢視mysql實時執行sql的工具

該工具為我的同事朱旭開發的一款可以檢視mysql資料庫實時執行的sql狀況的工具,以前苦於通過show processlist/show full processlist抓取sql的同志們現在只要盯一盯螢幕就可以了,非常的方便,點選這裡進行下載,使用方法也很簡單,如下: [email pr

【FFMpeg視訊開發與應用基礎】一、使用FFmpeg命令工具和批處理指令碼進行簡單的音視訊檔案編輯

《FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK》視訊教程已經在“CSDN學院”上線,視訊中包含了從0開始逐行程式碼實現FFMpeg視訊開發的過程,歡迎觀看!連結地址:FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK

hexo 通過hexo-admin進行全自動釋出文章能線上拷貝圖片實時檢視效果更加優雅!!!完成hexo g -d 徹底脫離命令操作!!!!

首先因為有的圖片外鏈是不能檢視的比如我們的csdn,這個時候需要先執行npm命令下載外掛,再下載圖片在複製到某個資料夾,再進行引用,真的是好麻煩,但是自從有了hexo-admin,媽媽再也不用擔心我了,

javaagent來對java位元組進行變換

1、實現變換的函式typedef void (JNICALL *jvmtiEventClassFileLoadHook) //類位元組碼變換的回撥介面 (jvmtiEnv *jvmti_env, //註冊的jvmti JNIEnv* jni_env, //

一段c#操作datatable的代

apt server adapter datatable lin ase sql sel uid using System; using System.Collections.Generic; using System.Data; using System.Dat

什麼庫寫 Python 命令程式?看一篇就夠了

作者:HelloGitHub-Prodesire HelloGitHub 的《講解開源專案》系列,專案地址:https://github.com/HelloGitHub-Team/Article 一、前言 在近半年的 Python 命令列旅程中,我們依次學習了 argparse、docopt、cl

怎麼以文字方式檢視二進位制位元組檔案

1,在http://www.ej-technologies.com/download/jclasslib/files.html根據自己的作業系統下載jclasslib工具 2,解壓縮,找到bin下的jclasslib.exe,雙擊執行 3,然後file-->open

二進位制檔案和ASCII檔案區別

二進位制檔案和ASCII檔案(即文字檔案)的區別,對於和計算機親近時間尚短的同學是個難題。本文用簡單的例子,試圖展示其中的道道,希望能對菜鳥們有些幫助。1、一個例子:兩種100000  有程式:#include<iostream> using namespace

ascii與二進制區別?

text info asc lin 二進制 -s ascii碼 國際 iso ascii編碼和二進制碼是兩個概念。ASCII主要是為了電腦顯示和傳輸拉丁字母而發明的一套編碼,二進制則是為了計算機方便計算、傳輸數據而使用的一種方法。ASCII(American Stan

淺析TVS管可以完全替代壓敏電阻嗎背後究竟貓膩?

    TVS管的非線性特性和穩壓管一樣,擊穿前漏電流很小,擊穿後是標準的穩壓特性,比起壓敏電阻來TVS管最大箝位電壓偏離擊穿電壓較小,優於壓敏電阻。在很多精細保護的電子電路中,應用TVS管是比較好的選擇。TVS管的流通量在限壓型浪湧保護器件中是最小的,一般用於最末級的精細保護,因其流

每個 HTML 檔案裡開頭都個很重要的東西Doctype知道是幹什麼的嗎?

每個HTML檔案裡開頭都有個很重要的東西 ,Doctype,知道這是幹什麼的嗎? 要點一 : 該標籤告知瀏覽器瀏覽文件要使用的HTML規範 , 告知瀏覽器以何種規範解析頁面 要點二 : 宣告對大小寫不敏感

sim卡的EF(Elementary File:基本檔案檔案作用???

轉自:http://blog.sina.com.cn/s/blog_7ffb8dd50100zbgd.html sim卡的檔案系統有自己規範,主要是為了和手機通訊,sim本 身可以有自己的作業系統,EF就是作儲存並和手機通訊用的 SIM (Subscriber Iden

ArrayList集合實現RandomAccess介面作用?為何LinkedList集合卻沒實現介面?

眾所周知,在List集合中,我們經常會用到ArrayList以及LinkedList集合,但是通過檢視原始碼,就會發現ArrayList實現RandomAccess介面,但是RandomAccess接口裡面是空的!Linked並沒有實現RandomAccess介面。 這是為