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

EugenOS

Active member
22.07.2007
27
0
#1
Доброго времени суток всем.
Потребовалось иметь в своей программе окно HEX редактора, т.к. файлы не большие ( 160 байт макс. )
то сделал по-топорному, функцию заполнения TStrings

Код:
//---------------------------------------------------------------------------
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:

Код:
//---------------------------------------------------------------------------
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' };
//---------------------------------------------------------------------------
в общем результат выглядит следующим образом:
Код:
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 дней говорит адью. Если кто знает где подобный фриварный компонент можно скачать, дайте плиз ссылку.
 

EugenOS

Active member
22.07.2007
27
0
#2
да, еще, в RichEdit'е использую моноширинный шрифт, так что по координатам столбцы "ровные"