Autor |
Beitrag |
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 21.12.04 20:09
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?
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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: www.luckie-online.de/Delphi/Sonstiges
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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...
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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!
Ist aber ohnehin egal, wenn er es nicht darstellen will.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 23.12.04 20:47
Ich habe mir jetzt einen Code (Konsolenanwendung) zusammengebastelt:
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 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: 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!
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.12.04 21:35
Kannst du das mal irgendwie etwas leserlicher formatieren?
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 23.12.04 21:59
Ich weis nicht, wie du das meinst.. ich kommentiers mal aus, damits nach was aussieht
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); 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]:=((Puffer[i]+1)mod 255); 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. |
Ich hoffe, das half...
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
|
|
|