Autor Beitrag
Andromeda
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 16.10.03 18:01 
ich habe hier eine procedure die du evtl, noch anpassen musst:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: 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
ausblenden Quelltext
1:
2:
WW JoelH
ii JoelH

_________________
mfg. Joel
Andromeda Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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