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