Thema: Delphi Unicode + BASE64?

Einzelnen Beitrag anzeigen

blackdrake

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

Re: Unicode + BASE64?

  Alt 26. Aug 2007, 18:27
Hallo.

Nach 2 Tagen rumprobieren und verzweifeln, bin ich doch noch auf einen grünen Zweig gekommen. Wie ich bereits zuvor behauptet habe und was hier quasi jeder bestritten hat, funktioniert es doch, einen WideString in einen aufgeblähten AnsiString zu lagern und umgekehrt.

Der Code sieht so aus:

Delphi-Quellcode:
// WideString-Inhalte in einen AnsiString schreiben (dieser ist 2-Mal so groß)

function WideStringToDoubleLongAnsiString(ws: WideString): AnsiString;
var
  i: integer;
  wc: widechar;
begin
  result := '';
  for i := 1 to length(ws) do
  begin
    copymemory(@wc, @ws[i], sizeof(wc));
    result := result + chr(lo(ord(wc))) + chr(hi(ord(wc)));
  end;
end;

function DoubleLongAnsiStringToWideString(dls: AnsiString): WideString;

  // [url]http://www.delphipraxis.net/post27809.html[/url]
  function HexToInt(HexNum: string): LongInt;
  begin
    Result:=StrToInt('$' + HexNum);
  end;

  function BuildWideChar(char2, char1: char): WideChar;
  begin
    result := widechar(hextoint(inttohex(ord(char1), 2)+inttohex(ord(char2), 2)));
  end;

var
  i: integer;
  c: array [0..1] of char;
begin
  i := -2;
  result := '';
  repeat
    i := i + 2;
    if i >= length(dls) then break;
    copymemory(@c[0], @dls[i+1], sizeof(c));
    result := result + BuildWideChar(c[0], c[1]);
  until false;
end;
Ich hoffe dass diese Funktionen all denen viel Arbeit abnehmen, die das selbe Problem (WideString mit einer String-Funktion zu bearbeiten) haben.

Ich kann hier perfekt einen WideString in einen doppelt so großen AnsiString packen, diesen mit DEC (das nur Strings annimmt) verschlüsseln und das ganze dann wieder rückwärts laufen lassen. Somit habe ich einen WideString ver- und entschlüsselt.

Und angenommen, es würde Probleme mit #0 oder was-weiß-ich-was geben, dann ersetze ich einfach chr() mit inttohex() und hänge somit die Hexadezimalen Werte der Wide-Char-Halbierungen hinereinander (FFFE1F...). Dann wäre der AnsiString 4 Mal so groß und würde keine binären Zeichen mehr enthalten, aber dann gibt es absolut keine Probleme mehr! Hier ist der Beispielcode:

Delphi-Quellcode:
// Hexadezimale WideString-Inhalte in einen AnsiString schreiben (dieser ist 4-Mal so groß)

function WideStringToHexAnsiString(ws: WideString): AnsiString;
var
  i: integer;
  wc: widechar;
begin
  result := '';
  for i := 1 to length(ws) do
  begin
    copymemory(@wc, @ws[i], sizeof(wc));
    result := result + inttohex(lo(ord(wc)), 2) + inttohex(hi(ord(wc)), 2);
  end;
end;

function HexAnsiStringToWideString(dls: AnsiString): WideString;

  // [url]http://www.delphipraxis.net/post27809.html[/url]
  function HexToInt(HexNum: string): LongInt;
  begin
    Result:=StrToInt('$' + HexNum);
  end;

  function BuildWideChar(char2, char1: char): WideChar;
  begin
    result := widechar(hextoint(inttohex(ord(char1), 2)+inttohex(ord(char2), 2)));
  end;

var
  i: integer;
  c: array [0..3] of char;
begin
  i := -4;
  result := '';
  repeat
    i := i + 4;
    if i >= length(dls) then break;
    copymemory(@c[0], @dls[i+1], sizeof(c));
    result := result + BuildWideChar(Chr(HexToInt(c[0]+c[1])), Chr(HexToInt(c[2]+c[3])));
  until false;
end;
Ich danke denen, die sich mit dem Problem beschäftigt haben und mir Codeteile gegeben haben anstelle von großen Sprüchen. Auch bedanke ich mich bei den C-Leuten, die mich auf die CopyMemory Idee gebracht haben.

PS: Wäre doch was für die CodeLib, oder?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat