Thema: Delphi String umwandeln

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: String umwandeln

  Alt 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;
$2B or not $2B
  Mit Zitat antworten Zitat