Entwickler-Ecke

Dateizugriff - End of Text-Zeichen?


JayEff - Di 21.12.04 20:09
Titel: End of Text-Zeichen?
Ich habe mal irgentwo gelesen, dass es ein End-Of-Text zeichen gibt, welches dafür sorgt, das eine Datei ab diesem Zeichen nicht mehr als Text geladen wird. Es kommt anscheinend in Exe dateien oder JPGs vor, denn das Memo hört nach einigen Zeichen auf, durch Lines.LoadFromFile den Text zu laden. Das will ich verhindern. Kann ich irgentwie auf den gesammten inhalt einer JPG datei z.B. zugreifen, und ihn behandeln, als wäre er ein String oder eine Stringlist oder eben etwas ähnliches?


Delete - Di 21.12.04 20:17

Darstellen in einem Memo wirst du eine binär Datei nur können, wenn du alle Steuerzeichen in darstellbare Zeichen umwandelst. So bal das memo auf ein #0 trifft ist Ende, da das String Ende Zeichen ist. In eine Stringliste könntets du es komplett reinbekommen. Eventuell hilft dir auch mein HexLoader auf meiner Seite: http://www.luckie-online.de/Delphi/Sonstiges


JayEff - Di 21.12.04 20:43

Danke erstmal,Luckie, ich habs mir angeguckt, und bemerkt, es wandelt jedes zeichen der datei in $+seinen hexwert+ ' ' um. das klappte auch gleich prima, aber ich möchte einich nichts weiter, als die Zeichen der datei in einer Variable speichern und dann irgentetwas machen, dass aus einer normal lesbaren JPG eine datei macht, die nur mein Programm selbst versteht.
Es würde schon reichen, die letzten 100 zeichen ab zu spalten und in einer anderen datei zu speichern; mit dieser datei kann man dann nur etwas anfangen, wenn man weis, wie man die beiden dateien wieder zusammen zu bringen hat. Eenn ich wüsste, wie das geht, könnte ich ja auch zu komplizierterem übergehen, wie z.B. jedes 100ste zeichen rausnehmen und später wieder einsetzen. oder ähnliches.

Aber danke für deine Hilfe! Jetzt weis ich wenigstens, dass ich #0 nicht ohne weiteres darstellen kann... (ich wusste nicht, dass es vorkommt... dachte, es ist glecihbedeutend mit *nichts*, weil man einen tastendruck verhindern kann, wenn man key:=#0; setzt.)


galagher - Mi 22.12.04 22:42

JayEff hat folgendes geschrieben:
Jetzt weis ich wenigstens, dass ich #0 nicht ohne weiteres darstellen kann...

Hallo!
Wenn's um die Darstellung geht, versuche es so: Datei mit BlockRead einlesen und gleich die #0 durch zB. ' ' ersetzen und das ganze dann mit BlockWrite in eine temporäre Datei schreiben. Diese kannst du dann in ein Memo laden.


JayEff - Do 23.12.04 02:58

darum gehts mir aber doch garnicht. ich will blos die datei als variable benutzen können! vll kann man sie hexadezimal in einen array of integer laden? dazu muss ich mir noch mal die source von luckies programm ansehen...


Delete - Do 23.12.04 04:48

galagher hat folgendes geschrieben:
Datei mit BlockRead einlesen und gleich die #0 durch zB. ' ' ersetzen und das ganze dann mit BlockWrite in eine temporäre Datei schreiben. Diese kannst du dann in ein Memo laden.
´
Das reicht nicht. Alle Steuerzeichen (0-30 oder war es 33) sind nicht darstellbar, die müsste er alle ersetzten. Aber ich habe eigentlich nicht verstanden, was er will. So wie ich das sehe will er es eigentlich doch gar nicht darstellen, da kann man das doch einfach in einen Puffer laden und dort die Daten direkt bearbeiten.


JayEff - Do 23.12.04 15:06

Puffer! das hört sich nach dem an, was ich suche! hast du das in deiner source so geregelt? wenn ja - dann dürfte die frage beantwortet sein! wenn nein - könntest du mir kurz beschreiben, wie ich das mache?

Damit ichs richtig verstanden habe: wenn ich das so mache, dann habe ich eine Variable oder einen array, in dem die gesammte datei unverändert drin ist? das wäre genau das, was ich suche...


galagher - Do 23.12.04 19:17

Luckie hat folgendes geschrieben:
Das reicht nicht. Alle Steuerzeichen (0-30 oder war es 33) sind nicht darstellbar

Das stimmt nicht, ich ersetzt nur #0, und es klappt! :mahn:
Ist aber ohnehin egal, wenn er es nicht darstellen will.


JayEff - Do 23.12.04 20:47

Ich habe mir jetzt einen Code (Konsolenanwendung) zusammengebastelt:


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:
program Krypter;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  classes;

var
  Puffer:array of Byte;
  fs:TFileStream;
  x:string;
  i,bar,count,percent:integer;
label ende;
begin
try
//fs:=TFileStream.Create(ParamStr(1),fmOpenRead);
except
WriteLn('Ungueltige Parameter: '+ParamStr(1));
WriteLn('Bitte Taste druecken um das Programm zu beenden');
ReadLn;
exit;
end;
SetLength(Puffer,fs.Size);
fs.ReadBuffer(Puffer[0],fs.Size);
bar:=round(fs.Size/100);
count:=0;
percent:=0;
for i:=0 to length(Puffer) do
begin
  Puffer[i]:=65;
  Inc(count);
  if count=bar then
  begin
    count:=0;
    inc(percent);
    writeln('* '+IntToStr(percent));
  end;
end;
fs.Free;
fs:=TFileStream.Create(ParamStr(1)+'.kry',fmCreate);
fs.Write(Puffer,length(Puffer));
fs.Free;
readln;
end.


Mir ist klar, dass die Schleife zu nichts führt, da dem Puffer nur im element [0] etwas zugewiesen ist.. Ich würde in meinem kleinen beispiel hier gerne einfach jedes zeichen der datei einzeln mit einem a ersetzen. Dabei ist allerdings die Datei immer leer. Mir ist klar, dass da ein Fehler drin ist, mit dem Puffer[i]... aber wie schaffe ich das, jedes zeichen einzeln zu behandeln? kann ich denn nicht sowas wie in der art hier machen:


Delphi-Quelltext
1:
2:
3:
for i:=0 to fs.Size do begin
fs.ReadBuffer(Puffer[i],1);
end;
, also dass ein Zeichen eingelesen wird. Dabei kommt allerdings ein Stream-Lesefehler raus, und außerdem denke ich, dass er nur das erste zeichen immer und immer wieder lesen würde. ich muss also versuchen, dem Programm zu sagen, er soll danach um 1 zeichen weiter gehen. wie mache ich das nun wieder??


edit: grade gemerkt, dass ich nir fs.size-1 in der schleife benutzen muss. jetzt fehlt noch die tatsache, dass er nix reinschreibt, in die erzeugte datei.

edit: Problem gefunden, hier der neue code:

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:
program Krypter;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  classes;

var
  Puffer:array of Byte;
  fs:TFileStream;
  x:string;
  i,bar,count,percent:integer;
label ende;
begin
try
fs:=TFileStream.Create(ParamStr(1),fmOpenRead);
except
WriteLn('Ungueltige Parameter: '+ParamStr(1));
WriteLn('Bitte Taste druecken um das Programm zu beenden');
ReadLn;
exit;
end;
SetLength(Puffer,fs.Size);
for i:=0 to fs.Size-1 do begin
fs.ReadBuffer(Puffer[i],1);
end;
bar:=round(fs.Size/100);
count:=0;
percent:=0;
for i:=0 to length(Puffer) do
begin
  Puffer[i]:=byte(Puffer[i]+1);
  x:=x+char(Puffer[i]);
  Inc(count);
  if count=bar then
  begin
    count:=0;
    inc(percent);
    writeln('* '+IntToStr(percent));
  end;
end;
fs.Free;
fs:=TFileStream.Create(ParamStr(1)+'.kry',fmCreate);
for i:=0 to length(Puffer) do fs.Write(Puffer[i],1);
fs.Free;
readln;
end.


edit: irgentwas stimmt immernoch nicht. eine zurückverschlüsselte textdatei stimmt mit dem origial über ein, nicht aber eine binäre datei.

HILFE!


Delete - Do 23.12.04 21:35

Kannst du das mal irgendwie etwas leserlicher formatieren?


JayEff - Do 23.12.04 21:59

Ich weis nicht, wie du das meinst.. ich kommentiers mal aus, damits nach was aussieht :D


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:
program Krypter;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  classes;

var
  Puffer:array of Byte;
  fs:TFileStream;
  i,bar,count,percent:integer;
begin
try
  fs:=TFileStream.Create(ParamStr(1),fmOpenRead); //die datei die per parameter übergebenwurde, laden.
except
  WriteLn('Ungueltige Parameter: '+ParamStr(1));
  WriteLn('Bitte Taste druecken um das Programm zu beenden');
  ReadLn;
  exit;
end;
SetLength(Puffer,fs.Size);
for i:=0 to fs.Size-1 do
begin
  fs.ReadBuffer(Puffer[i],1);//Zeichen für Zeichen in den Puffer laden
end;
bar:=round(fs.Size/100);//Eine art Progressbar berechnen
count:=0;
percent:=0;
for i:=0 to length(Puffer) do
begin
  Puffer[i]:=((Puffer[i]+1)mod 255);//#255 -> #0 ... #200 -> #201
  Inc(count);
  if count=bar then
  begin
    count:=0;
    inc(percent);
    writeln('* '+IntToStr(percent)+'%');//Die "Progressbar" zeichnen..(gäbe bessere möglichkeiten...
  end;
end;
fs.Free;
fs:=TFileStream.Create(ParamStr(1)+'.kry',fmCreate);//neue Datei erstellen
for i:=0 to length(Puffer) do fs.Write(Puffer[i],1);//Die neue Datei mit dem Pufferfüllen..
fs.Free;
readln;
end.


Ich hoffe, das half...


Udontknow - Di 28.12.04 14:52

Hallo!

Ich habe mir nun nicht alles hier durchgelesen, gebe aber trotzdem meinen Senf dazu! :)

Das Steuerzeichen 26 ($1A) bedeutet "End of File" und bewirkt genau das beschriebene. Es muss, um die Datei mit Lines.LoadFromFile oder per Assign/Reset/Readln komplett einzulesen, entfernt bzw. geändert werden.

Cu,
Udontknow