Entwickler-Ecke

Dateizugriff - Hexeditor


Andromeda - Di 14.10.03 16:39
Titel: Hexeditor
hi @ll

ich habe folgendes problem.. ich möchte aus eine bin datei werte einlesen und diese dann ins folgendes format umwandeln...

Quelltext
1:
2:
Adresse      16 Werte       ASCII (Also HexEditor)
00022     FF CC AA...      .sd.d...

bis jetzt habe ich die daten aus einer datei ausgelesen in eine HexZahl umgewandelt dann+ Char(wert)+Zugewiesene Adresse, dann in einem string abgespeichert und dem Memo übergeben. Das dauert bei einer 1 oder 3 mb datei aber so ziemlich lange. Nun habe ich versucht die werte ersteinmal in einer stringliste abzuspeichern und diese dann dem Memo1 Feld zu übergeben klappt auch ganz gut nur erreiche immer noch nicht die geschwindigkeit die ich mir wünschen würde :cry: ..dauert immer noch 2minuten bei einer 1 mb datei...

Kann mir da einer Helfen wie ich die daten viel schneller auslesen und umwandeln kann?

Noch paar fragen nebenbei die mir eventuell weiterhelfen. Wie kann ich, wenn ich einen Zeiger habe, auf dessen Adresse über diesen Zeiger schreiben ich mein den Inhalt auslesen geht ja über IntToStr(p^) aber wie tu ich was drauf?

Wie kann ich in einem Memo oder RichEdit feld eine bestimmte Zeilenlänge deklarieren und wie kann ich auf eine bestimmt Position in diesen Editoren schreiben.. es geht darum wenn ich meine hexdezimaldarstellung habe das die zeichen unterschiedlich lang sind und dadurch alles total unsymetrisch erscheint das heißt die zeichen beeinflussen sich in ihrer länge gegenseitig..

Kennt vielleicht einer einen gut programmierten Hexeditor mit Quellcode dazu?

ok ich hoffe mir kann einer helfen .......mfg

Moderiert von user profile iconTino: Beitrag formatiert (war sehr schwer zu lesen).


mimi - Di 14.10.03 18:28

wegen dem geschwindigkeits problem solltes du dein qullcode mal posten.

Zitat:

wie kann ich, wenn ich einen zeiger habe, auf dessen adresse über diesen zeiger schreiben ich mein den inhalt auslesen geht ja über IntToStr(p^)
aber wie tu ich was drauf ?

wie wäres wenn du den wert in eime string speicherst dann wirder in einen int umwandels und dann einfac plus den wert der dazu addiert werden soll.


Andromeda - Mi 15.10.03 16:27
Titel: Quellcode
ich glaube nicht das es an meinem Quellcode liegt, eher an der methode wie ich die werte behandle..über zeiger braucht man viel weniger speicher. so sieht der quellcode wo es lange dauert , habe den ersteinmal verkürzt, es werden nur HexZahlen dargestellt, die geschwindigkeit wird dadurch nicht schneller obwohl ich die charzeichendarstellung rausgenommen habe.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
procedure TForm1.ffnen1Click(Sender: TObject);
var     hex_index,index_abstand,t,pos:integer;
        k,gs,f_name,abstand,s,s1,s2:string;
        rfile:file of byte;
        w:byte;
        f_size,l,index_liste:integer;
        l1:TStringList;
        pos1:integer;
       
begin


for index_abstand:=1 to 5 do begin
    abstand:=abstand+#32;
   end;
hex_index:=0;
index_liste:=0;
pos:=0;

f_name:=Form3.Edit1.Text;
AssignFile(rfile,f_name);
Filemode:=0;
Reset(rfile);
f_size:=FileSize(rfile);
str(f_size,s);
Form1.Caption:=s;
//while not eof (rfile) do begin
for l:=1 to f_size do begin
read(rfile,w);
k:=k+'   '+IntToHex(w,2);
{gs:=gs+char(w); }
application.ProcessMessages;

if hex_index=16 then begin //breite einer liste
s1:=abstand+k;{+abstand+gs;}
l1.Insert(index_liste,s1);
k:='';
gs:='';
hex_index:=0;
index_liste:=index_liste+1;
end else  hex_index:=hex_index+1;
if (hex_index<16and (l=f_size) then begin //breite einer liste
s1:=abstand+k+abstand+gs;
l1.Insert(index_liste,s1);
k:='';
gs:='';
hex_index:=0;
end;
if index_liste=500 then begin     //listenlänge
Form2.RichEdit1.SelText:=l1.Text;
index_liste:=0;
l1.Clear;
end;
if (index_liste<500and (l=f_size) then begin  //listenlänge
Form2.RichEdit1.SelText:=l1.Text;
l1.Clear;
end;
{Form3.ProgressBar1.StepBy(round(f_size/100));}
end;
CloseFile(rfile);
l1.Destroy;
end;

mfg.


Gausi - Mi 15.10.03 17:34

habs nur kurz überflogen, aber wahrscheinlich wirds deshalb so langsam, weil du jedes Byte einzeln ausliest. Mach besser so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var buffer: array of byte;
[...]
fsize:=filesize(rfile);
setlength(buffer,fsize);
blockread(rfile,buffer[0],length(buffer));
CloseFile(rfile);
[...]
for l:=0 to fsize-1 do
begin
    w:=buffer[l];
    [...]
end;

Das sollte VIEL schneller gehen


mimi - Mi 15.10.03 17:39

nuzte doch mal TFileStream, damit werden die daten schnller eingelesen.
ansonten kann ich im code auch nichts andres finden.


Andromeda - Do 16.10.03 17:44

ok ich versuch es wikrlich mal mit TFileStream und dann mit dem Buffer...mal sehen wie viel schneller es geht ..so jetzt hätte ich noch ein weiteres Problem ..die zeichen die im Hexformat ausgegeben werden sind unterschiedlich lang obwohl wenn ich die länge mit Legth ermittele sie bei allen 2 ist, das heißt die zeichen verschieben sich zum beispiel
AA DD CC
00 FF FC
wie kann ich im Memo oder RichEdit auf eine bestimmte Position schreiben..muss ich jedesmal die Cursorposition berechnen ??

übrigens danke für die schnellen antworten...
mfg

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


mimi - Do 16.10.03 18:01

ich habe hier eine procedure die du evtl, noch anpassen musst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.str_into_RichEdit(Insert_Text:string; line:integer; position:integer);
var
  h : integer;
begin
  with Editor do begin
    for h := Lines.Count to line-1 do Lines.Add('');
      for h := length(Lines[line-1]) to position do Lines[line-1] := Lines[line-1] + ' ';
      Lines[line-1] := copy(Lines[line-1], 1, position-1) + Insert_Text + copy(Lines[line-1], position, length(lines[line-1]));
  end;
end;

das ist ne sehr alte funktion *G*


JoelH - Do 16.10.03 19:50
Titel: hmm,
also das mit dem verschieben der Zeichen ist wohl ein Truefont Problem, du musst einen FONT wählen der alle Zeichen in der selben Breite ausgibt, zB. Courier . Den Cursor kannste mit CaretPos an eine bestimmte Stelle setzen .


mimi - Do 16.10.03 19:57

diese funktion läuft unter jedem font, oder was meinst du ?
ich nutze sie schon seit ca zwei jarhen und sie funktioniert einband frei *G*


JoelH - Fr 17.10.03 23:22
Titel: hmm,
@mimi
Ich meinte nicht dein Posting, ich meinte das von Andromeda, das Problem ist der Truetypefont da ergibt sich bei MS Sans Serif oder Arial eine verschiedene Breite der Zeichen bei gleicher anzahl, weil die Zeichen angepasst werden, ein 'W' ist halt breiter als ein 'BLANK' oder ein 'i'

aber wenn man zB. COurier nimmt dann ist ein WW genauso breit wie ein ii

machen zB. auch die Codetags aufem BOARD

ohne Tags

WW JoelH
ii JoelH

mit Tags

Quelltext
1:
2:
WW JoelH
ii JoelH


Andromeda - Fr 17.10.03 23:32

ok leute danke für den tipp die funktion mit der positionierung ist nicht schlecht , die einfachste lösung ist in deisem fall die mit dem truetypefont :shock:
ich frage mich wieso ich nicht eher drauf gekommen bin :roll:
ok danke nochmal für die antworten werd mich übers we mal hinsetzen
und mein programm nocheinmal überarbeiten.
mfg