![]() |
Re: Unicode + BASE64?
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.
|
Re: Unicode + BASE64?
Zitat:
![]() 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". |
Re: Unicode + BASE64?
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:
Ich kenne mich mit Pointern nicht so wirklich aus...
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; |
Re: Unicode + BASE64?
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; |
Re: Unicode + BASE64?
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:
Dieser Code soll einfach nur uni.txt (42 Byte) mit Inhalt
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; 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 |
Re: Unicode + BASE64?
Delphi-Quellcode:
Ist ja auch klar. Du versuchst jedliche "Compiler-Magic" bezüglich Referenzzählung bei Strings mit der Holzhammermethode (Harte Casts) zu erschlagen.
Desweiteren habe ich herausgefunden, dass meine Funktion nicht geht:
Schon mal überlegt das deine lokale Variable
Delphi-Quellcode:
automatisch beim verlassen der Funktion WideStringToDoubleLongString Speichertechnisch freigegeben wird und du dann als result-Parameter einen Nirvana-Pointer hast?
ByteArray: Array of Char;
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:
Hast du überhaupt meinen letzten Post gelesen wie du die DEC-Methode mit Widestrings aufrufen könntest? |
Re: Unicode + BASE64?
Zitat:
Wieso funktioniert denn UTF8 nicht? ![]() ![]() UTF8 wäre auch bei wenigen speziellen Zeichen (bspw. dt. Sprache) speichereffizienter als andere Unicode-Kodierungen. |
Re: Unicode + BASE64?
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:
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:
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 |
Re: Unicode + BASE64?
Zitat:
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 |
Re: Unicode + BASE64?
Am einfachsten wäre doch:
Delphi-Quellcode:
Wobei ICH auch glaube, dass String(ByteArray) funktioniert. Warum probierst dus nicht einfach aus?
var
Str: String; ByteArray: Array of Char; // .. begin // .. SetLength(Str, Length(ByteArray) -1); Copy(@Str[1], @ByteArray[0], Length(ByteArray)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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