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 2 von 6     12 34     Letzte »    
Benutzerbild von Zacherl
Zacherl

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

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 14:57
Welche Zeile genau?
  Mit Zitat antworten Zitat
blackdrake

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

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 14:59
Bei der Copy-Zeile. Ich glaube 2tes Argument.
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 15:00
Dann versuch mal nur @UnicodeStr oder UnicodeStr[0] .. keine Ahnung wie sich das genau verhält.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 15:10
Zitat von blackdrake:
Mhh... so in etwa? Hier sagt er, es seien inkompatible Typen.

[delphi]function WideStringToString_Lossyless(UnicodeStr: WideString): string;
Vergiss diesen Versuch! Ein String ist ein String und ein WideString ist ein WideString! Falls du des doch hinbekommst wirst du bei jeder Funktion scheitern die als Stopper ein #$00 am Ende des Strings erwartet.
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
 
#15

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 15:29
Wie soll ich denn sonst das Problem lösen? Ich muss den WideString ja irgendwie in einen String umwandeln, diesen dann ver- und entschlüsseln und diese Umwandlung danach wieder Rückgängig machen, ohne dass Informationen verloren gehen. Die Grundproblematik ist doch klar, oder? Das ich einen japanischen Text von WideString nicht nach String umwandeln kann, ohne dass dieser nur komische Zeichen enthält, ist mir klar.

Edit: Außerdem gilt #00 bei Strings bzw. #00#00 bei WideStrings ja nur speicherintern bzw bei Streams. Nach der Verschlüsselung hab ich ja nichts mehr dergleichen. Wenn ich einen String "test" habe, ist ja das #00 auch nur innerhalb des RAMs da und nicht im String selbst.
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#16

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 15:33
Wieso musst du den Widestring in einen String umwandeln? Das geht nicht, da gehen dir Zeichen verloren. Du musst den Widestring in ein Byte-Array umwandeln und dieses dann verschlüsseln.

Das geht doch bestimmt über irgendwelche Pointer-tricks mit CopyMem(). Aber da kenn ich mich nicht wirklich aus. Ich gehe Pointern aus dem Weg
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
blackdrake

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

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 15:40
Das meine ich ja, mit Byte-Array zwischenstufe. Der String soll aufgebläht sein, sodass eben keine Informationen verloren gehen. Ist unter Umständen das vorher genannte UTF-8 das, was ich suche?

Wie gesagt, die strings sollen nur als Übergang dienen, weil die Verschlüsselungsroutine nur strings annimmt. Sie sollen keinen Sinn ergeben.

CopyMem() gibt's als Funktion nicht. Und Copy() dient trotz seiner Bezeichnung nur zum Abschneiden von Strings.
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#18

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 15:46
Ist CopyMem nicht so n toller Win32-API-Call?

Dass die Verschlüsselungsroutine nur Strings annimmt, is schon ein bisschen doof, wenn man Unicode verarbeiten will. Kannste die nicht auf ein byte-Array umschreiben?

Ein WideChar ist ja 16 Bit, ein normaler Char nur 8 Bit. Wenn du nun von deinem Widechar jeweils die ersten 8 Bit (Hi) in den ersten Char und die letzten 8 Bit (Lo) in den nächsten char kopierst, dann hast du einen doppelt so langen String, aber ohne Verlust von Informationen. Diesen kannst du dann verschlüsseln. Aber ich weiss nicht, ob eventuelle #0 im String Delphi durcheinanderbringen (aber ich denke, Delphi verwaltet die Strings anders als C mit den null-terminierten Strings)...
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
blackdrake

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

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 16:02
Danke für den Hinweis.

Delphi hat keine Probleme mit Strings und #0. Man hat lediglich Probleme wenn man einen solchen String ausgeben möchte. Er wirkt wie abgeschnitten, was er aber nicht ist.

Folgendes Funktioniert nun:

Delphi-Quellcode:
function WideStringToString_Lossyless(UnicodeStr: WideString): string;
var
  ByteArray: Array of Char;
begin
  SetLength(ByteArray, Length(UnicodeStr));
  CopyMemory(@ByteArray[0], @UnicodeStr[1], Length(UnicodeStr));
  result := string(ByteArray);
end;
Jetzt bin ich nur noch am rumprobieren mit der Reverse-Funktion:

Delphi-Quellcode:
function DoubleStringToWideString(DoubleString: WideString): widestring;
var
  ByteArray: Array of WideChar;
begin
  SetLength(ByteArray, Length(DoubleString) div 2);
  CopyMemory(@DoubleString[1], @ByteArray[0], Length(ByteArray));
  result := widestring(ByteArray);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Sollte exakt ANSI "test" sein
  showmessage(DoubleStringToWideString(WideStringToString_Lossyless('test')));
end;
Diese funktioniert aber nicht ganz...
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
 
#20

Re: Unicode + BASE64?

  Alt 25. Aug 2007, 16:14
Wie schon gesagt: Entweder du suchst dir eine Funktion die mit einfachen Pointer + Längenangabe arbeitet oder du wandelst den String nach UTF8 um und hast das Ergebnis dan in einen String.

Deine Hacker-Funktionen werden scheitern wenn dein bisher ausgesuchte Base64-Methode geziehlt ein #$00 als Stop-Byte annimmt.

Schon mal überlegt ob die Zeile
SetLength(ByteArray, Length(UnicodeStr)); richtig ist wenn eine WideString-Character 2 Bytes einnimmt
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 6     12 34     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