Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Base64EncStr / Base64DecStr von gammatester kein Unicode? (https://www.delphipraxis.net/202581-base64encstr-base64decstr-von-gammatester-kein-unicode.html)

DieDolly 19. Nov 2019 18:36


Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Ich habe mir gerade die beiden funktionen Base64EncStr und Base64DecStr aus gammatesters Unit Mem_Util angeguckt und mir ist aufgefallen, dass die scheinbar kein Unicode können.
(͡° ͜ʖ ͡°) erg ibt etwas, was man nicht mit Base64DecStr zurückrechnen kann.

Delphi-Quellcode:
uses Mem_Util;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Text := '(͡° ͜ʖ ͡°)';
end;

function Base64Encode(const S: string): string;
begin
 Result := Base64EncStr(S);
end;

function Base64Decode(const S: string): string;
begin
 Result := Base64DecStr(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit2.Text := Base64Encode(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Edit1.Text := Base64Decode(Edit2.Text);
end;
gammatesters Base64EncStr ergibt: KD+wID8/ID+wKQ==
TNetencoding.Base64Encode ergibt: KM2hwrAgzZzKliDNocKwKQ==

Gibt es hier einen Trick? Innerhalb von Mem_Util sind string-Parameter als BString deklariert, was bei mir AnsiString ergibt.
Delphi-Quellcode:
{$ifdef BIT16}
  {$ifdef V7Plus}
    type
      BString = string[255];  {String of 8 bit characters}
      pBString = ^BString;
      char8    = char;         {8 bit characters}
      pchar8   = pchar;
  {$else}
    type
      BString = string[255];  {String of 8 bit characters}
      pBString = ^BString;
      char8    = char;         {8 bit characters}
      pchar8   = ^char;
  {$endif}
{$else}
  {$ifdef UNICODE}
    type
      BString = AnsiString;   {String of 8 bit characters}
      pBString = pAnsiString;
      char8    = AnsiChar;     {8 bit characters}
      pchar8   = pAnsiChar;
    {$else}
    type
      BString = AnsiString;   {String of 8 bit characters}
      pBString = pAnsiString;
      char8    = AnsiChar;     {8 bit characters}
      pchar8   = pAnsiChar;
  {$endif}
{$endif}
Ich möchte gerne diese Funktionen nutzen, da die doch weitaus schneller sind als die in der TNetEncoding Unit.

Bernhard Geyer 19. Nov 2019 20:19

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Evtl. das was für dich?
https://lemire.me/blog/2018/01/17/ri...-and-decoding/

DieDolly 19. Nov 2019 20:32

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Schon wieder eine neue Bibliothek? Das ist Englisch. Das spreche ich so gut wie Portugisisch. Also gar nicht.
Falls der text sagen soll, dass das nicht geht. Der hier kann es ja auch: https://www.base64encode.org/

Uwe Raabe 19. Nov 2019 20:36

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Was spricht gegen TNetEncoding?

DieDolly 19. Nov 2019 20:55

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Ich nehme alles zurück was ich zur Geschwindigkeit sagte.
Bis letztes Jahr oder so war TNetEncoding noch sehr viel langsamer als Mem_Util. Jetzt ist es umgekehrt.

Getestet mit 500 Zeilen mit je 50 zufälligen Zeichen. TNetEncoding ist bei mit rund 5x schneller.

MyRealName 20. Nov 2019 07:24

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Ich habe bei mir auch alles auf TNetEncoding umgestellt, weiß aber nicht, ab wann es eigentlich bei Delphi mit drin ist.

Uwe Raabe 20. Nov 2019 07:57

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Vergleichbare Routinen gab es in Soap.EncdDecd.pas bereits seit XE2. System.NetEncoding.pas gibt es seit XE7.

Andreas13 20. Nov 2019 09:23

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Zitat:

Zitat von DieDolly (Beitrag 1451600)
Schon wieder eine neue Bibliothek? Das ist Englisch. Das spreche ich so gut wie Portugisisch. Also gar nicht.
https://www.base64encode.org/

Hallo,
nur ein kleiner Tipp zu Englisch: Du kannst Deine englischen (aber auch "portugiesischen") Texte in einer exzellenten Qualität von
https://www.deepl.com/translator
übersetzen lassen. Es liefert eine wesentlich bessere Übersetzung als z.B. der Google-Translator. Nachteil: derzeit gibt es nur 7 Fremdsprachen.
Gruß, Andreas

Redeemer 20. Nov 2019 19:19

AW: Base64EncStr / Base64DecStr von gammatester kein Unicode?
 
Was du in deinem Code versuchst, ist einen UTF-16-String in Base64 zu kodieren. Das ergibt für Alphabetschriften selbst bei Unterstützung durch den Encoder keinen Sinn, weil die in der BMP liegen. Du solltest also UTF8Encode benutzen. Das ergibt einen RawByteString, also einen AnsiString ohne Codepage. Den sollte der Decoder dann auch annehmen. Der Compiler sollte eigentlich auch meckern, von wegen imnplizite Stringumwandlung mit Datenverlust.
Nach dem Dekodieren muss man natürlich noch UTF8ToWideString aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz