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
Tino: 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; for l:=1 to f_size do begin read(rfile,w); k:=k+' '+IntToHex(w,2);
application.ProcessMessages;
if hex_index=16 then begin s1:=abstand+k; 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<16) and (l=f_size) then begin s1:=abstand+k+abstand+gs; l1.Insert(index_liste,s1); k:=''; gs:=''; hex_index:=0; end; if index_liste=500 then begin Form2.RichEdit1.SelText:=l1.Text; index_liste:=0; l1.Clear; end; if (index_liste<500) and (l=f_size) then begin Form2.RichEdit1.SelText:=l1.Text; l1.Clear; end;
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
Tino: Ü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
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!