Autor |
Beitrag |
Andromeda
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 14.10.03 16:39
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  ..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
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Andromeda 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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.
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
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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
_________________ We are, we were and will not be.
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Andromeda 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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*
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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 .
_________________ mfg. Joel
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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*
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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
_________________ mfg. Joel
|
|
Andromeda 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
ich frage mich wieso ich nicht eher drauf gekommen bin
ok danke nochmal für die antworten werd mich übers we mal hinsetzen
und mein programm nocheinmal überarbeiten.
mfg
|
|