AGB  ·  Datenschutz  ·  Impressum  







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

Paradox spezielle Datentypen laden

Ein Thema von UntoterGeist · begonnen am 17. Feb 2021 · letzter Beitrag vom 19. Feb 2021
Antwort Antwort
Incocnito

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

AW: Paradox spezielle Datentypen laden

  Alt 18. Feb 2021, 07:00
Sowas vielleicht:
Delphi-Quellcode:
var
  msTemp : TMemoryStream;
  ssTemp : TStringStream;
...
begin
...
  msTemp.Clear();
  Query.FieldByName('TollesByteFeld').GetData(TheBytes);
  msTemp.Write64(TheBytes, 0, Length(TheBytes));
  TNetEncoding.Base64.Encode(msTemp, ssTemp);
...
  xxx := ssTemp.DataString;/ ssTemp.SaveToFile('C:\Temp\DaRein.dat');
...
end;
  Mit Zitat antworten Zitat
UntoterGeist

Registriert seit: 18. Sep 2019
25 Beiträge
 
#2

AW: Paradox spezielle Datentypen laden

  Alt 18. Feb 2021, 20:17
Ja Danke, das war so der Schubs in die richtige Richtung. Hab das aber ein bisschen anders gelöst.
Code:
SetLength(Bytes,ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).Size);
ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).GetData(Bytes);
Stream := TMemoryStream.Create();
if Assigned(Stream) then
  begin
    Stream.Write(Bytes,Length(Bytes));
    Stream.Position := 0;
    StrVar := Base64Encode(Stream)+';';
    FileWrite(ExportFile,PByte(StrVar)^,Length(StrVar));
    FreeAndNil(Stream);
  end
Mir ist aber so beim Testen was aufgefallen. Wenn das Feld jetzt ein String ist und ich mir die Raw Bytes ausgeben lasse, bin ich nicht in der Lage aus den Bytes wieder den Original String zu generieren. Das hab ich probiert, aber glaube ich hab was falsch gemacht. Oder das geht so grundsätzlich nicht. Zumindest hab ich gelesen, dass das fehlerhafte Ausgaben produziert. Hab es mit PChar, WideChar und AnsiChar ausprobiert. Aber es kam immer nur Datensalat bei raus. Hab mir auch mal die FieldByName.AsString Methode angeschaut. War aber auch nicht sehr erhellend.
Code:
SetLength(Bytes,ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).Size);
ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).GetData(Bytes);
Stream := TMemoryStream.Create();
if Assigned(Stream) then
  begin
    Stream.Write(Bytes,Length(Bytes));
    Stream.Position := 0;

    SetString(StrVar,PChar(Stream.Memory),Stream.Size div SizeOf(Char));
    StrVar := StrVar + ';';

    FileWrite(ExportFile,PByte(StrVar)^,Length(StrVar));
    FreeAndNil(Stream);
  end
  Mit Zitat antworten Zitat
Incocnito

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

AW: Paradox spezielle Datentypen laden

  Alt 19. Feb 2021, 07:33
Und so geht das nicht?
Delphi-Quellcode:
  SetLength(Bytes, ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).Size);
  ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).GetData(Bytes);
  Stream := TMemoryStream.Create();
  Stream2 := TStringStream.Create([]); // evtl muss hier noch das Encoding mit angegeben werden
  //Stream2 := TStringStream.Create('', TEncoding.UTF8, False);
  try
    Stream.Write(Bytes, Length(Bytes));
    Stream.Position := 0;
    //Stream2.Position := 0; // evtl?
    Stream2.LoadFromStream(Stream);
    //Stream.Position := 0; evtl?
    //Stream2.Position := 0; // evtl?
    Stream2.DataString := Stream2.DataString + ';'; // Hinweis A
    Stream2.SaveToFile(ExportFile);
  finally
    FreeAndNil(Stream);
    FreeAndNil(Stream2);
  end;
Ich denke, wenn du Bytes ausliest und nur in eine Datei schreibst müsste das Encoding egal sein.
Nur wenn du mit DataString tatsächlich das ganze in Delphi irgendwo verwenden willst,
müsstest du auch mit dem richtigen Encoding arbeiten. Dazu musst du wissen, mit welchem
Encoding die Daten gespeichert wurden.

Hinweis A: An der Stelle arbeitest du mit dem DataString. Du fügst dass "Semikolon" den
eigendlichen Daten hinzu. Je nachdem mit welchem Encoding du arbeitest, könnten den Daten
nun (beispielsweise) 1 Byte oder 2 Byte hinzugefügt werden. Daher müsstest du wissen,
welches Encoding vorliegt. ... Um genau zu sein denke ich sogar, dass bei falschem Encoding
das Auslesen und Schreiben Stream2.DataString := Stream2.DataString; bereits die Daten schon zerstören können. Oder du bekommst eine Fehlermeldung,
dass da ein Zeichen in den Bytes ist, was vom Encoding nicht unterstützt wird.

Solange Delphi (und da weiß ich jetzt nicht, wie das genau gelöst ist bei TStringStream)
intern beim LoadFromStream, SaveToFile, usw. nur mit den Bytes arbeitet wäre
das Encoding für diese Routinen halt egal. Theoretisch braucht man das Encoding ja nur
um eine Representation als String zu erhalten, vorher nicht.

(Ich hoffe ich erzähle nicht allzugroßen Unsinn, aber so hatte ich das wenigstens verstanden.
Ich bin jetzt auch kein Guru, was Encodings angeht! )

LG Incocnito
  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 22:15 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-2025 by Thomas Breitkreuz