Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Base64 to RawByteString (https://www.delphipraxis.net/204922-base64-rawbytestring.html)

Incocnito 14. Jul 2020 12:45

Base64 to RawByteString
 
Hi zusammen,

ich habe im Moment in etwa folgende Funktion:
Delphi-Quellcode:
class procedure TSuper_Api.DoDecode(
  const sBase64Daten : String;
  var  rawData     : RawByteString
);
var
  baseStream : TStringStream; // Base64-codiert
  tempStream : TStringStream; // Ergebnis
begin
  SetLength(rawData, 0); // Nur zur Sicherheit
  tempStream := TStringStream.Create(); // Ergebnis
  try
    baseStream := TStringStream.Create(sBase64Daten);
    tempStream.Clear();
    try
      TNetEncoding.Base64.Decode(baseStream, tempStream);
      rawData := RawByteString(tempStream.DataString);
    finally
      baseStream.Free();
    end;
  finally
    tempStream.Free();
  end;
end;
Das funktioniert wunderbar, aber der cast von "RawByteString(tempStream.DataString)"
erscheint mir falsch. Ich habe zumindest das Gefühl, dass ich noch was "falsch" mache
oder zumindestens "nicht schön".
Die Lösung mit den StringStreams ist ja so wunderbar einfach und wie gesagt
funktioniert das ja auch alles, aber es gibt dafür doch sicherlich einen
"richtigeren" Weg!? Geht da was über den MemoryStream? Oder hat der StringStream
Funktionen um die "Daten" als RawByteString abzugreifen, vielleicht über "tempStream.Bytes"?
Ich hoffe ihr wisst, was ich meine!

Liebe Grüße und danke schonmal für's lesen!
Incocnito

TiGü 14. Jul 2020 13:20

AW: Base64 to RawByteString
 
Und was machst du mit richtigen binären Daten, die als Base64 string reinkommen?
Bspw. eine Firmware, ein Bitmap/QR-Code und sonst was alles?

Wenn du dir sicher bist, dass deine Base64-Daten eh alle eine textuelle Information enthalten, dann kannst du das auch abkürzen:
Delphi-Quellcode:
class procedure TSuper_Api.DoDecode(
  const sBase64Daten : String;
  out rawData: RawByteString
);
var
  DecodedBytes: TBytes;
begin
  DecodedBytes := TNetEncoding.Base64.DecodeStringToBytes(sBase64Daten);
  if ImVerySureItIsJustStringData then
  begin
    rawData := RawByteString(TEncoding.UTF8.GetString(DecodedBytes));
  end;
end;

Incocnito 14. Jul 2020 14:07

AW: Base64 to RawByteString
 
Hi TiGu,

ich bin mir nicht 100%ig sicher, was da an Daten kommt,
aber ein Teil davon ist "als Text lesbar", falls du das meinst.
Beispielsweise "§~~00020‚ Hallo Welt&}}!", wobei er hier die Byte-Codes, die ich
hier reinkopiert habe auch schon wieder rauswirft.
In "Wirklichkeit" sind das dann Byte-Codes, die für andere Informationen stehen.
Meiner Meinung nach macht das noch keinen Delphi-UCSString (?), da die Daten an sich
nur im Text-Anteil als ASCII (oder ANSI?, ich bin mir da nie so sicher) kodiert sind.
Der Rest sind Byte-Codes für irgendwelche Stati.
Ich bin also näher am Bitmap/Firmware-Code/... als am Text.
(Man kann ja auch den Inhalt einer EXE-Datei in einen String laden, aber das will doch keiner!)
Hoffendlich ist nun etwas klarer, worum es geht.
Auf Informationen bezüglich der Daten würde ich auch gerne verzichten
und das Problem so allgemein wie möglich halten.

MfG
Incocnito

TiGü 14. Jul 2020 14:57

AW: Base64 to RawByteString
 
Es wäre dann sinnvoller nach TBytes oder einen Stream zu dekodieren und dann innerhalb des (bekannten?) Binärformates nach den Strings zu suchen, insofern du die wirklich brauchst.

Irgendwelche Binärdaten hart in einen String (sei es nun Unicode- oder dieser spezielle Ansistring=RawByteString) zu casten ist fehleranfällig, um sich zu sagen geradezu falsch.

Incocnito 14. Jul 2020 15:05

AW: Base64 to RawByteString
 
Ich meine auch, dass wenn überhaupt dann "TStringStream.Bytes" (oder meinetwegen TMemoryStream.Bytes)
der richtige Ansatz wäre. Also TBytes, wie du ja auch schon sagst.
Ich denke, dass das RawByteString noch aus den Pascal-Zeiten kommt.
Und den sonst funktionierenden Quelltext der mit RawByteString arbeitet fasse ich sicher nicht an.
Dann lasse ich das lieber so häßlich mit dem Typecast von String auf RawByteString. 🤯

MfG
Incocnito

mytbo 14. Jul 2020 15:58

AW: Base64 to RawByteString
 
In der mORMot Unit SynCommons.pas findest du Funktionen wie:
  • BytesToRawByteString()
  • StreamToRawByteString()
  • und verschiedene Base64Toxxx Funktionen

Bis bald...
Thomas

Incocnito 14. Jul 2020 16:16

AW: Base64 to RawByteString
 
Das ist ja mal ein nettes Nachschlagewerk.
Probiere ich morgen dann aus! Danke erstmal! 👌

MfG
Icocnito

Redeemer 14. Jul 2020 18:23

AW: Base64 to RawByteString
 
Zitat:

Zitat von Incocnito (Beitrag 1469540)
Ich denke, dass das RawByteString noch aus den Pascal-Zeiten kommt.

RawByteString kommt aus Delphi 2009, weil es um AnsiString ohne Codepage geht. Win32-Delphi kannte vor 2009 keine Codepages.
Zitat:

Zitat von TiGü (Beitrag 1469527)
Und was machst du mit richtigen binären Daten, die als Base64 string reinkommen?

RawByteString ist meines Wissens binärsicher.

himitsu 14. Jul 2020 19:09

AW: Base64 to RawByteString
 
Zitat:

Zitat von Redeemer (Beitrag 1469555)
binärsicher.

Nicht direkt, aber es ist keine böse CodePage deffiniert, so dass es nicht zu unerwarteten Char-Konvertierungen kommt, wenn zu Ansi- oder UnicodeString konvertiert/zugewiesen wird.

Da man in den mobilen Plattformen krankhaft die ANSI-Strings versteckt hat, wäre es eh intelligenter das garnicht erst zu verwenden.
TBytes für Binärdaten ist doch ein netter Typ? Und TFile, TEncoding, sowie TNetEncoding.Base64.DecodeStringToBytes verstehen den auch.

Zitat:

Win32-Delphi kannte vor 2009 keine Codepages.
Kennen kannte es das schon, aber es wurde nicht explizit im String gespeichert und überall "implizit" die lokale ANSI/Default-CodePage verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 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