AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Base64 to RawByteString

Ein Thema von Incocnito · begonnen am 14. Jul 2020 · letzter Beitrag vom 14. Jul 2020
Antwort Antwort
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#1

Base64 to RawByteString

  Alt 14. Jul 2020, 13:45
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 14:20
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;
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#3

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 15:07
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 15:57
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.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#5

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 16:05
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
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#6

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 16:58
In der mORMot Unit SynCommons.pas findest du Funktionen wie:
  • BytesToRawByteString()
  • StreamToRawByteString()
  • und verschiedene Base64Toxxx Funktionen

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#7

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 17:16
Das ist ja mal ein nettes Nachschlagewerk.
Probiere ich morgen dann aus! Danke erstmal! 👌

MfG
Icocnito
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 19:23
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.
Und was machst du mit richtigen binären Daten, die als Base64 string reinkommen?
RawByteString ist meines Wissens binärsicher.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: Base64 to RawByteString

  Alt 14. Jul 2020, 20:09
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Jul 2020 um 20:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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