首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 實現 TRichEdit 自動格式化顯示二進位檔案

     編輯:關於C++

註冊自訂轉換類別,讓 RichEdit 開啟 EXE/OBJ/BIN 自動顯示十六進位

繼承 TConversion 覆寫 ConvertReadStream,將二進位資料流轉為十六進位文字 (含位址、ASCII 碼、字元顯示),再向 TRichEdit 註冊副檔名關聯。

自訂轉換類別

class THexConversion : public TConversion
{
public:
    virtual int __fastcall ConvertReadStream(TStream *pStream,
        char *pSrcBuffer, int nBufSize);
};

int __fastcall THexConversion::ConvertReadStream(TStream *pStream,
    char *pSrcBuffer, int nBufSize)
{
    if (nBufSize <= 82) return 0; // 緩衝區太小

    String strTemp;
    unsigned char szDstBuffer[16];
    int n = pStream->Read(szDstBuffer, 16);
    if (n == 0) return 0;

    // 位址 (8 位十六進位)
    strTemp = strTemp.sprintf("%.8xh: ", pStream->Position);

    // 十六進位位元組 (四個一組)
    for (int i = 0; i < n; i++) {
        strTemp += IntToHex(szDstBuffer[i], 2) + " ";
        if ((i+1) % 4 == 0) strTemp += " ";
    }

    // 補齊空白至固定寬度
    strTemp += String(' ', 65 - strTemp.Length()) + "; ";

    // ASCII 字元顯示 (不可列印顯示 '.')
    for (int i = 0; i < n; i++) {
        if (szDstBuffer[i] < 32 || szDstBuffer[i] > 126) szDstBuffer[i] = '.';
        strTemp += (char)szDstBuffer[i];
    }
    strTemp += "\n";

    strcpy(pSrcBuffer, strTemp.c_str());
    int nResult = strTemp.Length();

    // 顯示載入進度 (自訂函數)
    Form1->Process(pStream->Position);
    Application->ProcessMessages();
    return nResult;
}

註冊副檔名 (FormCreate)

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    RichEdit1->RegisterConversionFormat(NULL, "bin", __classid(THexConversion));
    RichEdit1->RegisterConversionFormat(NULL, "obj", __classid(THexConversion));
    RichEdit1->RegisterConversionFormat(NULL, "exe", __classid(THexConversion));
}

進度顯示輔助函數

void __fastcall TForm1::Process(int nPos)
{
    StatusBar1->SimpleText = "正在處理... " + String(nPos);
    StatusBar1->Update();
}

載入測試

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->Lines->LoadFromFile("C:\\123\\123.exe");
    StatusBar1->SimpleText = "載入完成!";
}

原理說明

  • RegisterConversionFormat 讓 RichEdit 遇到指定副檔名時實例化對應 TConversion 衍生類別處理資料流。
  • ConvertReadStream 每次讀取 16 位元組轉為一行十六進位文字,回傳寫入緩衝區的字元數。
  • 大檔案載入時透過 Application->ProcessMessages() 保持介面回應並更新進度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved