Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
Delphi 12 Athens
|
Re: String umwandeln
12. Feb 2009, 11:13
Delphi-Quellcode:
Procedure ChangeEndian( Var S: WideString); Overload;
ASM
TEST EAX, EAX
JZ @exit
MOV EAX, [EAX]
MOV ECX, [EAX - 4]
SHR ECX, 1
@Loop:
MOV DL, BYTE PTR [EAX]
XCHG DL, BYTE PTR [EAX + 1]
MOV BYTE PTR [EAX], DL
ADD EAX, 2
LOOP @Loop
@exit:
End;
Procedure ChangeEndian( Var S: UnicodeString); Overload;
ASM
TEST EAX, EAX
JZ @exit
CALL System.@UniqueStringU
MOV ECX, [EAX - 4]
@Loop:
MOV DL, BYTE PTR [EAX]
XCHG DL, BYTE PTR [EAX + 1]
MOV BYTE PTR [EAX], DL
ADD EAX, 2
LOOP @Loop
@exit:
End;
Procedure ChangeEndian(P: PWideChar; Len: Integer); Overload;
ASM
TEST EAX, EAX
JZ @exit
CMP EDX, 0
JLE @exit
MOV ECX, EDX
@Loop:
MOV DL, BYTE PTR [EAX]
XCHG DL, BYTE PTR [EAX + 1]
MOV BYTE PTR [EAX], DL
ADD EAX, 2
LOOP @Loop
@exit:
End;
falls jemand rausbekommt, wie man UniqueStringU, @UniqueStringU, bzw InternalUniqueStringU für einen UnicodeString per ASM aufruft, dann könnte man das Ganze komplett in Assembler lösen, aber irgendwie konnt ich da grad keinen Zugang finden
[add]
noch schnell was für Alle, welche lieber auf 'ne einfache und reine Pascalversion stehen:
Delphi-Quellcode:
Procedure ChangeEndian( Var S: WideString); Overload;
Var i: Integer;
Begin
For i := 1 to Length(S) do
S[i] := WideChar((Word(S[i]) shl 8) or (Word(S[i]) shr 8));
End;
Procedure ChangeEndian( Var S: UnicodeString); Overload;
Var i: Integer;
Begin
For i := 1 to Length(S) do
S[i] := WideChar((Word(S[i]) shl 8) or (Word(S[i]) shr 8));
End;
Procedure ChangeEndian(P: PWideChar; Len: Integer);
Var i: Integer;
Begin
While Len > 0 do Begin
P^ := WideChar((Word(P^) shl 8) or (Word(P^) shr 8));
Inc(P);
Dec(Len);
End;
End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
|
|
Zitat
|