Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#4

Re: 2-Byte-Characters lesen/ausgeben (Big Endian)

  Alt 14. Mai 2009, 22:09
neee, 'ne einfache Lösung gibt's nicht wirklich ...

theoretisch könnte man es via MultiByteToWideChar und der passenden CodePage machen, aber leider nur theoretisch, denn praktisch geht's nicht

Zitat von himitsu:
Unicode (ISO-10646-UCS-2) > CodePage: 1200
Unicode - Big Endian > CodePage: 1201

also bleibt nur der Weg des selbermachens, aber da ist es etwas unoptimal, wenn da auf jedes Zeichen direkt über den String zugegriffen würde, da Delphi dort dank der Compilermagic dort jedes Mal Einiges an Verwaltungskram einbaut...
Delphi-Quellcode:
function SwapString(const S: WideString): WideString;
var P, P2: PByte;
  i: Integer;
begin
  SetLength(Result, Length(S));
  P := Pointer(PWideChar(S));
  P2 := Pointer(PWideChar(Result));
  For i := Length(Result) - 1 downto 0 do Begin
    P[1] := P[0];
    P[0] := P[1];
    Inc(P, 2);
    Inc(P2, 2);
  End;
end;
weiß jetzt nicht ob das Pointer(...) unbedingt nötig ist ... ist es ja eigentlich nicht, also falls Delphi nicht meckert, dann einfach weglassen (bei Verwendung von PAnsiChar und C:AnsiChar würde Delphi zumindestens rumnörkeln)

oder direkt im String:
Delphi-Quellcode:
procedure SwapString(var S: WideString);
var P: PByte;
  C: Byte;
  i: Integer;
begin
  // UniqueString(S); // reinmachen, falls UnicodeString, anstatt WideString genutzt werden soll
  P := Pointer(PWideChar(S));
  For i := Length(S) - 1 downto 0 do Begin
    C := P[0];
    P[0] := P[1];
    P[1] := C;
    Inc(P, 2);
  End;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat