Delphi-PRAXiS

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/41489-string-umwandeln.html)

ferby 4. Mär 2005 06:34


String umwandeln
 
Hallo,


Ich habe einen Ansistring der nur aus zufälligen ASCII Zeichen besteht.
Ich will jetzt das diese Zeichen umgewandelt werden und die Umgewandelten Zahlen sollen in einen anderern String gespeichert werden.
So soll umgewandelt werden.

#1 --> 0000
#2 --> 0001
#3 --> 0002
#4 --> 0003
#5 --> 0010
#6 --> 0011
#7 --> 0012
#8 --> 0013
#9 --> 0020
usw.

Fällt euch da etwas ein wie mann das einfach lösen kann?
zB: Im Ansistring1 steht #1#10#5 dann soll es umgewandelt werden damit im Ansistring2 steht: 000000210010


wäre für hilfe dankbar...

Stefan Dieler 4. Mär 2005 06:45

Re: String umwandeln
 
Hallo,

für mich gibt es keine richtige Logik beim Umwandeln, oder habe ich da was übersehen?
So würde ich den einfacheren Weg gehen und einfach eine Funktion erstellen, in die du z.B. #5 als Parameter mitgibst und dann einen String ('0010') als Rückgabeparameter bekommst. Innerhalb der Funktion würde ich mit vielen if's bzw. case arbeiten.

Und anschließend kannst du ja die Strings zusammenketten.

Sprint 4. Mär 2005 06:46

Re: String umwandeln
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  S1, S2: String;
  I: Integer;
begin

  S1 := #1#10#5;
  S2 := '';

  for I := 1 to Length(S1) do
    case S1[I] of
      #1 : S2 := S2 + '0000';
      #2 : S2 := S2 + '0001';
      #3 : S2 := S2 + '0002';
      #4 : S2 := S2 + '0003';
      #5 : S2 := S2 + '0010';
      #6 : S2 := S2 + '0011';
      #7 : S2 := S2 + '0012';
      #8 : S2 := S2 + '0013';
      #9 : S2 := S2 + '0020';
      #10: S2 := S2 + '0021';
    end;

  ShowMessage(S2);

end;

jim_raynor 4. Mär 2005 07:23

Re: String umwandeln
 
Das sieht doch stark nach einer Umrechnung zur Basis 4 aus. Such doch einfach mal nach einer Funktion um eine Zahl in einen Binärstring umzuwandeln. Diese sollte man dann relativ leicht an die Basis 4 anpassen können.

himitsu 4. Mär 2005 09:25

Re: String umwandeln
 
Einfach jedes Zeichen in einen Integer umwandeln (Ord), dann die Bits aufteilen (shr und "and 3") und dann den erhaltenen Wert wieder in eine Zahl umwandeln (IntToStr).

Was die einzelnen Befehle machen, findest du in der OH ;)

Delphi-Quellcode:
S := 'abc...';

S2 := '';
For i := 1 to Length(S) do
  S2 := S2 + IntToStr((Ord(S[i]) shr 6) and 3) + 
    IntToStr((Ord(S[i]) shr 4) and 3) + 
    IntToStr((Ord(S[i]) shr 2) and 3) + 
    IntToStr(Ord(S[i]) and 3);
S ist dein zufälliger String
und S2 der mit den Zahlen ^^

ferby 4. Mär 2005 13:52

Re: String umwandeln
 
hallo,

danke, das klappt so wie ichs mir vorgestellt habe....

leider blicke ich nur da teilweiße bei der programmierung durch.

wie würde es funktionieren wenn ich genau umgekehrt umwandel möchte? aus s2 wieder s1 bekommen??


ferby

himitsu 7. Mär 2005 17:08

Re: String umwandeln
 
Delphi-Quellcode:
For i := 1 to Length(S) do
  S2 := S2 + IntToStr((Ord(S[i]) shr 6) and 3) + 
    IntToStr((Ord(S[i]) shr 4) and 3) + 
    IntToStr((Ord(S[i]) shr 2) and 3) + 
    IntToStr(Ord(S[i]) and 3);
Man kann diesen Code auch anders darstellen, dieses ist halt nur die schnelle Variante

Delphi-Quellcode:
For i := 1 to Length(S) do
  S2 := S2 + 
    IntToStr((Ord(S[i]) div 64) mod 4) + 
    IntToStr((Ord(S[i]) div 16) mod 4) + 
    IntToStr((Ord(S[i]) div 4) mod 4) + 
    IntToStr(Ord(S[i]) mod 4);

IntToStr((Ord(S[i]) shr 4) and 3):
Ord(S[i]) - wandelt das Zeichen in einn Integer um
X shr 4 - verschiebt die Bits nach rechts (Shift Right) - 10xx0100 > 000010xx
X and 3 - entfernt sonstige Bits - 000010xx > 000000xx
IntToStr(X) - wandelt es wieder in eine Zahl um




Delphi-Quellcode:
S := '0121212102120...';

S2 := '';
For i := 1 to Length(S) div 4 do
  S2 := S2 + Chr(
    StrToInt(S[i * 4] shl 6) + 
    StrToInt(S[i * 4 + 1] shl 4) + 
    StrToInt(S[i * 4 + 2] shl 2) + 
    StrToInt(S[i * 4 + 3]);
Einfach die Zahlen nehmen,
S[i * 4]
wieder in einen Interger zurückverwandeln,
StrToInt(X)
die Bits wieder an die richtige Stelle schieben
X shl 4
und dann nur noch zurück ins Zeichen.
Chr(X)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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-2025 by Thomas Breitkreuz