AGB  ·  Datenschutz  ·  Impressum  







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

Binärdaten platzsparend in JSON speichern

Ein Thema von Shark99 · begonnen am 24. Jul 2015 · letzter Beitrag vom 27. Jul 2015
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

Binärdaten platzsparend in JSON speichern

  Alt 24. Jul 2015, 19:04
Ich habe als Datenformat UTF-8 JSON (kann nicht geändert werden), und stehe nur vor der Aufgabe RTF Texte möglichst platzsparend darin abzuspeichern.

Habe dazu einen Beispiel-RTF-Code genommen der 30 KB als Widestring hat.

Mit der ZLIB komprimiere ich den auf 7 KB runter.

Wenn ich den jedoch an den JSON Parser übergebe werden in der Datei 29 KB daraus. Ich verschwende also CPU Zeit ohne wirklich Platz zu sparen.

Hat jemand eine andere Idee wie ich hier vorgehen soll? Mit einer End-Kompression von 40% wäre ich schon sehr zufrieden. Es handelt sich um Delphi 2009 mit dem SuperObject JSON Parser.

Danke im Voraus!

Geändert von TBx (26. Jul 2015 um 04:46 Uhr) Grund: Titel korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Binärdaten Platzsparent in JSON speichern

  Alt 24. Jul 2015, 19:20
Du musst den Stream in Base64 umwandeln, dann hast du ein 3:4 Verhältnis (3 Bytes RAW => 4 Bytes BASE64) und aus deinen 7KB sollten dann so ca. 9-10KB werden.

Ein kleiner Tip noch am Rande:
Ich erstelle mir immer Klassen, die exakt die Struktur wiederspiegelt, die ich in eine Schnittstelle hineingebe, bzw. von dort engegennehme (ein DataTrasnferObject).

Ich verbiege mir meine Business-Klassen nicht derart, dass die der Schnittstelle folgen.

Soll ein Business-Object nun durch so eine Schnittstelle laufen, gibt es dort einen Assembler, der die Konvertierung vom BO zum DTO und auch wieder zurück vornimmt.
Delphi-Quellcode:
TFooBO = class
  property RTFText: string; // RTF-Text
end;

TFooDTO = class
  property RTFData: string; // RTF komprimiert und als BASE64 kodiert
end;

TFooAssembler = class
  function Convert( AFooBO: TFooBO ): TFooSTO; override;
  function Convert( AFooDTO: TFooSTO ): TFooBO; override;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (24. Jul 2015 um 19:34 Uhr)
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#3

AW: Binärdaten Platzsparent in JSON speichern

  Alt 24. Jul 2015, 19:49
Funktioniert Base64 auch mit Widestrings, oder muss ich nach UTF8 wandeln? Würde auch Base85 gehen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Binärdaten Platzsparent in JSON speichern

  Alt 24. Jul 2015, 19:57
Funktioniert Base64 auch mit Widestrings, oder muss ich nach UTF8 wandeln? Würde auch Base85 gehen?
BASE64 funktioniert ausschließlich mit binären Daten -> eine Folge von Bytes.
Jede Komprimierung funktioniert ausschließlich mit binären Daten -> eine Folge von Bytes.
Jede Verschlüsselung funktioniert ausschließlich mit binären Daten -> eine Folge von Bytes.

Um einen String in BASE64 zu kodieren muss man sich erst die Byte-Folge von dem String holen. Dabei ist es wichtig die Kodierung zu beachten, die zwischen den beiden Systemen vereinbart wurde.

Beachten: JSON ist hier nur das Transport-Medium!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#5

AW: Binärdaten Platzsparent in JSON speichern

  Alt 24. Jul 2015, 19:58
Soll ich also aus meinem binären Widestring erstmals einen UTF8 AnsiString machen und dann Base64 daraus? Oder gibt es einen besseren weg?
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#6

AW: Binärdaten Platzsparent in JSON speichern

  Alt 24. Jul 2015, 20:05
Hab mal gemacht, also -> UTF8 -> Base64 und es steigt nur auf 14 KB (statt 29). Bleibt noch die Frage ob Base85 mit Jason möglich ist. Google ist da widersprüchlich.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Binärdaten Platzsparent in JSON speichern

  Alt 24. Jul 2015, 20:08
Nein, du komprimierst deinen RTF-Text wie gewohnt und erhälst eine Byte-Folge (Stream, Array ob Byte, whatever).

Diese Daten jagst du dann durch einen BASE64 Codierer und erhälst einen string.

Dieser string geht dann durch den JSON-Parser
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 21:19 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