AGB  ·  Datenschutz  ·  Impressum  







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

Unicode + BASE64?

Ein Thema von blackdrake · begonnen am 20. Aug 2007 · letzter Beitrag vom 27. Aug 2007
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#21

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 16:27
Als Hintergrundinformation: Ein String ist ein Array of Char = Array of Byte. Insofern haben Strings überhaupt keine Probleme mit #0. Der Datentyp welcher damit Probleme hat, weil er ihn als Trennzeichen ansieht ist PChar, bzw PAnsiChar.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.186 Beiträge
 
Delphi 10.4 Sydney
 
#22

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 16:34
Zitat von Zacherl:
Als Hintergrundinformation: Ein String ist ein Array of Char = Array of Byte. Insofern haben Strings überhaupt keine Probleme mit #0. Der Datentyp welcher damit Probleme hat, weil er ihn als Trennzeichen ansieht ist PChar, bzw PAnsiChar.
Nicht zu vergesend die Referenzzählung usw. Für Grundlagen wäre die Erklärung von dsdt vermutlich hilfreich.


Und da wir nicht wissen ob die zu verwendenten Base64-Funktion intern mit PChar's gearbeitet wird bzw. irgendwelche WinAPI-Funktionen aufgerufen werden wäre es mit Vorsicht zu genießen eine Widestring per Speicher-Copy in einen String zu "konvertieren".
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#23

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 16:46
Mensch, ist das ein Ärger mit Unicode + Delphi Die Fragestellung ist so simpel und die Lösung komplex.

Hilft folgendes zur Klärung der "Problem mit #0"-Frage?

Delphi-Quellcode:
type
  Binary = String; // LongString with Binary Contens

function TDECCipher.EncodeBinary(const Source: Binary; Format: TDECFormatClass): Binary;
begin
  SetLength(Result, Length(Source));
  Encode(Source[1], Result[1], Length(Source));
  Result := ValidFormat(Format).Encode(Result);
end;

procedure TDECCipher.Encode(const Source; var Dest; DataSize: Integer);
  // ...
  procedure EncodeECBx(S,D: PByteArray; Size: Integer);
  // ...
begin
  //...
  EncodeECBx(@Source, @Dest, DataSize);
  //...
end;
Ich kenne mich mit Pointern nicht so wirklich aus...
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.186 Beiträge
 
Delphi 10.4 Sydney
 
#24

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 16:59
Aus dem Bauch heraus:

Delphi-Quellcode:
function EncodeWideString(const Source: WideString; Format: TDECFormatClass): String;
var
  iSize: Integer;
begin
  iSize := Length(Source)*SizeOf(WideChar);
  SetLength(Result, iSize);
  Encode(Source[1], Result[1], iSize);
  Result := ValidFormat(Format).Encode(Result);
end;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#25

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 20:48
Ich probiere jetzt schon seit 3:30h alle verschiedenen Varianten rum und nichts funktioniert Mir fällt bald mein Abendessen aus dem Gesicht.

UTF8 hab ich auch schon probiert, auch negativ

Ich habe für die Verschlüsselungsfunktion auch ein Gegenstück entwickelt, doch dann herausgefunden, dass der Entschlüsselungskern nur Strings nehmen will.

Desweiteren habe ich herausgefunden, dass meine Funktion nicht geht:

Delphi-Quellcode:
function WideStringToDoubleLongString(UnicodeStr: WideString): string;
var
  ByteArray: Array of Char;
  PWC: PWideChar;
begin
  SetLength(ByteArray, Length(UnicodeStr) * sizeof(WideChar));
  PWC := PWideChar(UnicodeStr);
  CopyMemory(@ByteArray[0], @PWC, Length(UnicodeStr) * sizeof(WideChar));
  result := string(ByteArray);
end;

function ReadNullTerminatedWideString(const Stream: TStream): WideString;
var
  S: WideString;
  WC: WideChar;
begin
  S := '';
  repeat
    Stream.ReadBuffer(WC, 2);
    if (WC <> #0) then
      S := S + WC;
  until WC = #0;
  Result := S;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  test: TFileStream;
  ws: widestring;
  s: string;
begin
  test := TFileStream.Create('c:\uni.txt', fmOpenRead or fmShareDenyNone);
  ws := ReadNullTerminatedWideString(test);
  s := WideStringToDoubleLongString(ws);
  test.free;

  deletefile('c:\uni2.txt');
  test := TFileStream.Create('c:\uni2.txt', fmCreate);
  test.writebuffer(s, length(s));
  test.free;
end;
Dieser Code soll einfach nur uni.txt (42 Byte) mit Inhalt

testこれはちょうどテストであtest[null][null]

nach uni2.txt "kopieren". Erst wenn dies Funktioniert, kann ich weiter machen.

Die Größe der Ausgabedatei uni2.txt stimmt. Es sind 40 Byte (keine Null-Terminierung, deswegen nicht 42). Aber der Inhalt stimmt nicht:

ꡈí渊C๰ê拯B揭B๰ê椂C

Weiß denn niemand, wie ich die Inhalte eines WideStrings vorrübergehend in einen String lagern kann?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.186 Beiträge
 
Delphi 10.4 Sydney
 
#26

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 21:00
Desweiteren habe ich herausgefunden, dass meine Funktion nicht geht: Ist ja auch klar. Du versuchst jedliche "Compiler-Magic" bezüglich Referenzzählung bei Strings mit der Holzhammermethode (Harte Casts) zu erschlagen.

Schon mal überlegt das deine lokale Variable ByteArray: Array of Char; automatisch beim verlassen der Funktion WideStringToDoubleLongString Speichertechnisch freigegeben wird und du dann als result-Parameter einen Nirvana-Pointer hast?


Und fürs einlesen von Unicode-Textdateien (Neue Frage -> Neuer Thread) gibt es das ElPack, die TNTWare-Controls oder entsprechende Funktionen in der CodeLib (welche das ist lass ich dir jetzt mal selbst suchen).


Zitat von blackdrake:
Weiß denn niemand, wie ich die Inhalte eines WideStrings vorrübergehend in einen String lagern kann?
Nein, das geht nicht ohne die schon diskutierten Auswirkungen!!!!!!

Hast du überhaupt meinen letzten Post gelesen wie du die DEC-Methode mit Widestrings aufrufen könntest?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#27

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 21:18
Zitat von Zacherl:
Als Hintergrundinformation: Ein String ist ein Array of Char = Array of Byte. Insofern haben Strings überhaupt keine Probleme mit #0. Der Datentyp welcher damit Probleme hat, weil er ihn als Trennzeichen ansieht ist PChar, bzw PAnsiChar.
Ein Datentyp sieht garnix als Trennzeichen an, denn er ist nur ein Modell anhand dessen wir uns vorstellen können was abgeht. Das AnsiString sich in einen PChar (resp. PAnsiChar) und WideString in einen PWideChar wandeln läßt - und das oft genug implizit - sollte uns zu denken geben. String[X] mit X <= 255 ist tatsächlich ein "array of char", für den Rest hat Bernhard schon alles wichtige gesagt.

Wieso funktioniert denn UTF8 nicht?

http://msdn2.microsoft.com/en-us/library/ms776413.aspx und http://msdn2.microsoft.com/en-us/library/ms776420.aspx sollten doch die Lösung beinhalten.

UTF8 wäre auch bei wenigen speziellen Zeichen (bspw. dt. Sprache) speichereffizienter als andere Unicode-Kodierungen.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#28

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 23:15
Hallo.

UTF8Decode() und UTF8Encode() haben nur Schrott ausgegeben.

EDIT: Außerdem sind diese Funktionen von der Codepage abhängig. Ich will ja den String nicht verwenden, um ihn anzeigen zu lassen, sondern ihn nur als Container verwenden, der die Inhalte des WideStrings besitzt. Er ist doppelt so groß und kann #0 enthalten, was aber DEC egal ist.

Zitat von Bernhard Geyer:
Hast du überhaupt meinen letzten Post gelesen wie du die DEC-Methode mit Widestrings aufrufen könntest?
Doch und ich bin auch drauf eingegangen. Kodieren kann sein, dass es funktioniert, aber das Gegenstück funktioniert eben nicht, weil der Entschlüsselungskern der hochkomplizierten DEC Library nur strings als Eingabe versteht. Ich habe alleine da 3 Stunden mit verbracht, alles mögliche durchzuprobieren und bin zu keinem Ergebnis gekommen.

Das mit dem Einlesen der Unicode-Datei dient nur als Beispiel, damit ich einen japanischen Vorlagetext habe, mit dem ich testen kann. Ich brauche keine VCL, um einen WideString von einem Stream einzulesen.

Zitat von Bernhard Geyer:
Nein, das geht nicht ohne die schon diskutierten Auswirkungen!!!!!!
DEC hat bei Strings mit enthaltenen #0 keine Probleme gemacht. Wieso soll ich dann keine WideString-Umwandlung machen können?

Tut mir leid, dass ich mich hier so wenig auskenne. Aber es muss doch möglich sein, dass man einen WideString verschlüsselt. Man kann doch nicht die ganze DEC umschreiben, weil die Kernfunktionen nur strings annehmen.

Versteht ihr die Grundproblematik nicht?

WideString mit 10 Zeichen á 2 Bytes -> Char-Array -> String mit 20 Zeichen -> Verschlüsselter Text (keine Probleme mit #0!!!)
Verschlüsselter Text (keine Probleme mit #0!!!) -> String mit 20 Zeichen -> Char-Array -> WideString mit 10 Zeichen á 2 Bytes

Was soll daran unmöglich sein, 20 Bytes Widestring in 20 Bytes String umzuwandeln? Ob ein #0 in der Mitte vorkommt, ist dem DEC, das binäre Daten akzeptiert, egal.

Ich kann als Hobbyprogrammierer nur die Dinge, die ich mir selbst angeeignet habe. Also wäre ich dankbar, wenn ich Code anstatt von großen Sprüchen oder Fachbegriffen bekommen würde. Die helfen mir nichts. Es kann nicht sein, dass man 20 Bytes nicht in 20 Bytes umwandeln kann!!! Im Arbeitsspeicher sehen diese 20 Bytes alle gleich aus, egal ob sie als WideString oder als String interpretiert werden!

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#29

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 23:24
Zitat von Bernhard Geyer:
Schon mal überlegt das deine lokale Variable ByteArray: Array of Char; automatisch beim verlassen der Funktion WideStringToDoubleLongString Speichertechnisch freigegeben wird und du dann als result-Parameter einen Nirvana-Pointer hast?
Bist du dir da ganz sicher? Ich sage result := string(ByteArray).

ByteArray wird genommen und als String umgewandelt. Und ein String ist kein Pointer. Folglich zeigt result nicht ins leere. Oder nicht?

Bitte zeig mir lieber, wie man mit Codebeispielen es besser macht, anstatt an meinem Code rumzumeckern. Ich bin kein Fachinformatiker, aber ich sehe hier nicht, dass result ein Pointer ist. Result ist außerdem vom Typ "string". Folglich kein Pointer, der ins nichts zeigen kann.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#30

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 23:40
Am einfachsten wäre doch:

Delphi-Quellcode:
var
  Str: String;
  ByteArray: Array of Char;
  // ..
begin
  // ..
  SetLength(Str, Length(ByteArray) -1);
  Copy(@Str[1], @ByteArray[0], Length(ByteArray));
end;
Wobei ICH auch glaube, dass String(ByteArray) funktioniert. Warum probierst dus nicht einfach aus?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


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 10:18 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