![]() |
Re: String umwandeln
<OT>
@Masteric Bei deiner Signatur sollte es doch bestimmt "weiser Professor" und nicht "weißer" heißen, oder? Oder spielt die Hautfarbe für den Spruch irgendeine Rolle? :warn: </OT> |
Re: String umwandeln
:angel:
Delphi-Quellcode:
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 :?
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; [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; |
Re: String umwandeln
Zitat:
|
Re: String umwandeln
:wall: stümmt, so geht's :stupid: ,
dann noch ein paar kleine Fehler bei UniqueStringU-Parametern berichtigt und schon sieht's schön aus :angel: (neuer Code siehe oben) [add] jo, und für alle, welche auf PWideChar oder Array's stehen, hab ich noch je eine Version mit 'nem Pointer drangehängt :angel2: |
Re: String umwandeln
|
Re: String umwandeln
Gt, dann halt extra für sich noch 'ne Variante und für Dax einen schönen Funktionsnamen :angel2:
Delphi-Quellcode:
Procedure ChangeByteorder(Var S: WideString); Overload;
Var i: Integer; Begin For i := 1 to Length(S) do S[i] := WideChar(Swap(Word(S[i]))); End; Procedure ChangeByteorder(Var S: UnicodeString); Overload; Var i: Integer; Begin For i := 1 to Length(S) do S[i] := WideChar(Swap(Word(S[i]))); End; Procedure ChangeByteorder(P: PWideChar; Len: Integer); Overload; Var i: Integer; Begin For i := 0 to Len - 1 do P[i] := WideChar(Swap(Word(P[i]))); End; |
Re: String umwandeln
Gut, dann halt extra für dich noch 'ne Swap-Variante und für Dax einen schönen Funktionsnamen :angel2:
Delphi-Quellcode:
Die Funktionen machen jetzt zwar alle immernoch das Selbe, aber so ist zumindestens für jeden was dabei :mrgreen:
Procedure ChangeByteorder(Var S: WideString); Overload;
Var i: Integer; Begin For i := 1 to Length(S) do S[i] := WideChar(Swap(Word(S[i]))); End; Procedure ChangeByteorder(Var S: UnicodeString); Overload; Var i: Integer; Begin For i := 1 to Length(S) do S[i] := WideChar(Swap(Word(S[i]))); End; Procedure ChangeByteorder(P: PWideChar; Len: Integer); Overload; Var i: Integer; Begin For i := 0 to Len - 1 do P[i] := WideChar(Swap(Word(P[i]))); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz