![]() |
AW: AnsiString speichern und laden
Ich weis nicht, ob ich dir damit helfe, wenn ich mORMot ins Spiel bringe. Der Thread ist aber schon etwas länger und die Unit SynCommons enthält viele nützliche Funktionen für den Programmiereralltag. mORMot ist von D7 bis 10.4 verfügbar. Muss nicht installiert werden, es reicht, die Bibliothekspfade zu setzen. Den Download findest du
![]() ![]() ![]() Umgesetzt im Anfangsbeispiel:
Delphi-Quellcode:
Disclaimer: Ich weis schon, Kanonen auf Spatzen ... mORMot ist bei mir inzwischen in jedem Projekt und im Alltag inzwischen eine unverzichtbare Allzweckwaffe.
uses
SynCommons; procedure TForm1.Button2Click(Sender: TObject); begin if Txt = '' then Exit; SynCommons.FileFromString(Txt, Path); end; procedure TForm1.Button3Click(Sender: TObject); begin Txt := SynCommons.StringFromFile(Path); Memo1.Text := UTF8ToString(Txt); end; Bis bald... Thomas |
AW: AnsiString speichern und laden
Binärdaten in Strings waren noch nie eine super Idee.
Alternativen gibt es zu Genüge und wurden Einige genannt. |
AW: AnsiString speichern und laden
@Willie1: Auch wenn du es nicht hören wolltest, Kryptografie ist mit den richtigen Units vernünftig umzusetzen. Nimm besser die folgenden Funktionen:
Delphi-Quellcode:
Anwenden kannst du das wie folgt:
uses
SynCommons, SynCrypto, SynZip; const KEY_FILE_HEADER = 'TOPSECRET'; KEY_FILE_HEADER_SIZE = Length(KEY_FILE_HEADER); function SaveToFile(const pmcRaw, pmcPassword: RawByteString; const pmcFileName: TFileName): Boolean; begin Result := False; if (pmcRaw <> '') and (pmcPassword <> '') and (DirectoryExists(ExtractFilePath(pmcFileName))) then begin Result := FileFromString(KEY_FILE_HEADER + SynCrypto.AESSHA256(SynZip.CompressString(pmcRaw), pmcPassword, True), pmcFileName); end; end; function LoadFromFile(const pmcFileName: TFileName; const pmcPassword: RawByteString; out pmcRaw: RawByteString): Boolean; var sSrc, sOut: RawByteString; begin Result := False; if (pmcPassword <> '') and FileExists(pmcFileName) then begin sSrc := StringFromFile(pmcFileName); if (sSrc <> '') and (PosEx(KEY_FILE_HEADER, sSrc, 1) = 1) then begin SetString(sOut, Nil, Length(sSrc) - KEY_FILE_HEADER_SIZE); SynCrypto.AESSHA256(PAnsiChar(sSrc) + KEY_FILE_HEADER_SIZE, Pointer(sOut), Length(sOut), pmcPassword, False); pmcRaw := SynZip.UnCompressString(sOut); Result := (pmcRaw <> ''); end; end; end;
Delphi-Quellcode:
Bis bald...
procedure TForm1.btnSaveClick(Sender: TObject);
begin if SaveToFile(StringToUTF8(memoTopSecret.Text), 'Willie1', ChangeFileExt(ParamStr(0), '.key')) then memoTopSecret.Clear; end; procedure TForm1.btnLoadClick(Sender: TObject); var secStr: RawByteString; begin if LoadFromFile(ChangeFileExt(ParamStr(0), '.key'), 'Willie1', secStr) then memoTopSecret.Text := UTF8ToString(secStr); end; Thomas |
AW: AnsiString speichern und laden
Damit er erstmal dennoch weiterkommt
ohne extras die delphi nicht besitzt für das Experiment habe ich mal was getippst hier in Editor, in der Hoffnung das wichtigste zu zeigen.
Delphi-Quellcode:
nicht getestet, nur getippt
uses System.NetEncoding, System.IniFiles;
function WilliEnc(const AValue: AnsiString): AnsiString; var Nibble: AnsiString; begin Nibble := AValue; // mach hier dein nibble ding // hier verpacken wir alles in ein Base64 Nibble := TNetEncoding.Base64.Encode(Nibble); Exit(Nibble); end; function WilliDec(const AValue: AnsiString): AnsiString; var Bytes: TBytes; Nibble: AnsiString; begin // hier wird aus dem base64 wieder ein ansistring, und zwar nur ein ansistring (!) Bytes := TNetEncoding.Base64.DecodeStringToBytes(AValue); Nibble := TEncoding.ANSI.GetString(Bytes); // ab dieser stelle ist der geladene base64 kodierte inhalt wieder dein original ansistring // also mach ab hier dein nibble ding :-) Exit(Nibble); end; function LoadData: string; var Ini: TIniFile; begin Result := ''; if FileExists('name.ini') then begin Ini := TIniFile.Create('name.ini'); try Result := WilliDec(Ini.ReadString('Sektion', 'Ident', '')); finally Ini.Free; end; end; end; procedure SaveData(const AValue: string); var Ini: TIniFile; begin Ini := TIniFile.Create('name.ini'); try Ini.WriteString('Sektion', 'Ident', WilliEnc(AValue)); finally Ini.Free; end; end; // exemplarische Anwendung procedure TForm1.btnLoadClick(Sender: TObject); begin Edit1.Text := LoadData; end; procedure TForm1.btnSaveClick(Sender: TObject); begin SaveData(Edit1.Text); end; ...roter text beim speichern oh oh... //edit an Thomas: ich bin voll auf deiner seite! |
AW: AnsiString speichern und laden
Hallo,
da brauche ich Zeit, um das alles bewerten zu können. Mit der Kryptographie stimmt natürlich, es gibt eine komplette AES-Verschlüsselung als Delphi-Unit von einem Uni-Mathematiker aus Kiel, muss mal sehen, ob ich das noch wiederfinde. Mein Ansatz hat ja Fehler: zB. das Zeichen #255 und eine Zeichenkette = Linie wie ---- usw. würde es sofort offenbaren. Ich werde eure Erklärung ernst nehmen und "nachdenken". Willie. |
AW: AnsiString speichern und laden
Zitat:
wie Du bemerkst wollen Dir ja viele helfen, mein Vorschlag, öffne einen neuen Thread so das wir da uns mit Kryptographie beschäftigen können. Es gibt tausende Möglichkeiten wie man etwas verschlüsseln könnte. Enorm viel geht schon mit Delphi Bordmitteln, oft läuft es auf ein XOR hinaus. Bitmanipulation muss natürlich sehr durchdacht sein. Aber das wichtigste ist halt alles auf den richtigen Datentyp abzustimmen. Nur nicht Kopf in den Sand stecken, zusammen packen wir das schon :-) |
AW: AnsiString speichern und laden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz