Ich arbeite momentan an einem kleinen Projekt und habe leider schon das erste Problem beim Speichern. Als Beispiel habe ich eine Textdatei genommen in der nur ein a steht. Auslesen tut er auch den Wert 97 (=a). Aber er speichert es falsch ab, da der hier farbig mackierte Teil irgendein falsches Ergebnis zurückgibt. Bei 97 ergibt der Vergleich 1>0 false, dafür aber bei 159 wahr (0>0) :grubel: . Ich habe es auch schon mit not versucht, funktioniert aber auch nicht. Weiß einer von euch, wie man das umgehen kann, oder wo der Fehler liegt?
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:
| procedure Kompression(const DateiFileStream: TFileStream; FileStr: String); var i: Cardinal; SignCounter: array[0..255] of Cardinal; ReadBuffer: array[0..511] of Byte; ReadSize: Word; TakeSign: array of Byte; KompFileStream: TfileStream; begin for i:=0 to 255 do begin SignCounter[i]:=0; end; while DateiFileStream.Position<DateiFileStream.Size do begin ReadSize:=DateiFileStream.Read(ReadBuffer[0], 512); for i:=0 to ReadSize-1 do begin inc(SignCounter[ReadBuffer[i]]) end end; KompFileStream:=TFileStream.Create(Copy(FileStr, 1, length(FileStr)-length(ExtractFileExt(FileStr)))+'.pck', fmCreate or fmOpenWrite or fmShareDenyWrite); for i:=0 to 255 do begin if not (SignCounter[i]=0) then begin SetLength(TakeSign, High(TakeSign)+2); TakeSign[High(TakeSign)]:=SignCounter[i]; KompFileStream.Write(SignCounter[i], SizeOf(SignCounter[i])) end end; FreeAndNil(KompFileStream) end;
procedure TForm1.Button1Click(Sender: TObject); var DateiFileStream: TFileStream; OpenDialog: TOpenDialog; begin OpenDialog:=TOpenDialog.Create(Self); if OpenDialog.Execute then begin DateiFileStream:=TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite); if DateiFileStream.Size<=4294967295 then begin Kompression(DateiFileStream, OpenDialog.FileName); end else begin Application.MessageBox('Die ausgewählte Datei ist für diese Version zu groß!', 'Datei zu Groß', 16) end; FreeAndNil(DateiFileStream); end end; |