Hex редактор или как создать нередактируемые столбцы

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем EugenOS, 22 июл 2007.

  1. EugenOS

    EugenOS Active Member

    Регистрация:
    22 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    Доброго времени суток всем.
    Потребовалось иметь в своей программе окно HEX редактора, т.к. файлы не большие ( 160 байт макс. )
    то сделал по-топорному, функцию заполнения TStrings

    Код (Text):
    //---------------------------------------------------------------------------
    void __fastcall TForm1::fillHex( TStrings* memoLines, char* buf, int length )
    {
    if( !memoLines )
    {
    MessageBox( Handle, "Attemt to write to not created element!", "Warning", MB_OK);
    return;
    }
    memoLines->Clear();
    radix.LeadingZero = false;
    int datalen = (( length + 15 ) / 16 ) * 16;
    int lineCount = datalen / 16;
    char *cbuf = new char[datalen];
    // TODO: fill cbuf by 0
    memcpy( cbuf, buf, length );
    for( int l = 0; l < lineCount; l++ )
    {
    memoLines->Add( createHexString( cbuf, l*16 ) );
    }
    }
    //---------------------------------------------------------------------------
    AnsiString __fastcall TForm1::createHexString( char *buf, int addr )
    {

    radix.Value = addr;
    radix.MinDigitNumber = 8;
    AnsiString result = radix.Hex + " : ";
    radix.BytesCount = 8;
    radix.Value = *((__int64*)(buf + addr));
    result = result + radix.AsHexBytes + ":";
    radix.Value = *((__int64*)(buf + addr + 8));
    result = result + radix.AsHexBytes;
    return result;
    }
    //---------------------------------------------------------------------------
    которая использует класс Radix, вот функции от его пропертей
    AnsiString AsHexBytes и AnsiString Hex:

    Код (Text):
    //---------------------------------------------------------------------------
    AnsiString __fastcall Radix::rdHex(void)
    {
    bool leading_zero_flag = !LeadingZero;
    AnsiString Res = "0x";
    int i;
    for(i= 0; i< 16; i++)
    {
    qword val = Value << (i*4);
    char digNum = (char)((qword)(val >> 60));
    digNum &= 0x0F;
    if ( !( leading_zero_flag && (digNum == 0) ) )
    {
    leading_zero_flag = false;
    Res+=AnsiString(digits[digNum]);
    if( (i > 0) && (i < 15) && ((15-i) & 3)==0 )
    Res+=" ";
    }
    }
    int rl = Res.Length();
    int zeroadd = hexLen - rl;
    if( ( !LeadingZero ) && ( rl < hexLen ) )
    {
    AnsiString InsStr = "";
    Res = Res.SubString(3,Res.Length()-2);
    if( Res.Length() % 5 == 4 )
    Res = " " + Res;
    for( i = 1; i <= zeroadd; i++)
    {
    if( ( Res.Length() + i ) % 5 == 0 && i < zeroadd )
    InsStr = " " + InsStr;
    else
    InsStr = "0" + InsStr;
    }
    Res = "0x" + InsStr + Res;
    }
    return Res;
    }
    //---------------------------------------------------------------------------
    AnsiString __fastcall Radix::rdHexB(void)
    {
    AnsiString Res = "";

    for(int i= 0; i< bufLen; i++)
    {
    qword val = Value >> (i*8);
    char digNum = (char)(val);
    Res+=AnsiString(digits[(digNum >> 4)&0x0F]);
    Res+=AnsiString(digits[(digNum & 0x0F)]);
    if(i<bufLen-1)Res+=" ";
    }
    return Res;
    }
    //---------------------------------------------------------------------------
    const char Radix::digits[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
    //---------------------------------------------------------------------------
    в общем результат выглядит следующим образом:
    Код (Text):
    0x0000 0000 : 14 EC 00 03 4E 24 0D C2:27 FE 11 E2 1D 4B A1 85
    0x0000 0010 : D0 86 85 96 24 1D 78 7B:84 C9 72 EA 42 14 A2 E7
    0x0000 0020 : FC 0E 36 1B F0 AC B1 A4:06 87 63 35 CF 87 98 28
    0x0000 0030 : 72 C3 7F 9F EA AE 21 2C:30 93 C3 8C 5F 13 7C 3B
    0x0000 0040 : 37 2B CB 63 88 08 45 05:3A 19 1E BE 20 C0 EC 99
    0x0000 0050 : 70 BA 6B 1D 28 BF 9E 3A:1B C4 03 89 DB E6 23 80
    0x0000 0060 : F1 0F C9 1B 7A EE 18 26:9F 81 69 87 0A AC 6A 49
    0x0000 0070 : B7 75 BD 7E 03 0C 5B 1E:45 30 8A 37 29 7F D7 01
    0x0000 0080 : 01 01 01 B9 37 D1 81 98:3D D5 A3 D2 9B F4 42 AA
    0x0000 0090 : 86 04 80 00 00 00 00 00:00 00 0E 7F FF 26 47 38
    проблема в следующем: как в Memo или RichEdit запретить редактирование
    адресов и областей между байтами.

    Заранее спасибо.

    P.S. также подойдет вариант решения - воспользоваться готовым компонентом HexEditor, наподобие как на ELRA Soft, но у них компонент шароварный, и через 30 дней говорит адью. Если кто знает где подобный фриварный компонент можно скачать, дайте плиз ссылку.
     
  2. EugenOS

    EugenOS Active Member

    Регистрация:
    22 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    да, еще, в RichEdit'е использую моноширинный шрифт, так что по координатам столбцы "ровные"
     
Загрузка...

Поделиться этой страницей