Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String umwandeln (https://www.delphipraxis.net/106988-string-umwandeln.html)

GPRSNerd 12. Feb 2009 11:00

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>

himitsu 12. Feb 2009 11:13

Re: String umwandeln
 
:angel:
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;

sirius 12. Feb 2009 13:03

Re: String umwandeln
 
Zitat:

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
Du musst mindestens die Unit mit in den Call-Befehl schmeißen. Assembler denkt halt nicht so mit....

himitsu 12. Feb 2009 13:46

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:

Hawkeye219 12. Feb 2009 15:54

Re: String umwandeln
 
Hallo,

ich wollte nur schnell etwas Material in die Runde werfen: klick

Gruß Hawkeye

himitsu 12. Feb 2009 17:30

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;

himitsu 12. Feb 2009 17:32

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:
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;
Die Funktionen machen jetzt zwar alle immernoch das Selbe, aber so ist zumindestens für jeden was dabei :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr.
Seite 2 von 2     12   

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