Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Text in Dualzahlen umwandeln (https://www.delphipraxis.net/149535-text-dualzahlen-umwandeln.html)

countdown 23. Mär 2010 20:07


Text in Dualzahlen umwandeln
 
Hallo,
ich habe ein Problem bei dem ich einfach nicht weiterkomme.
Ich möchte gerne einen Text, der in ein Editfeld eingegeben wurde, in Dualzahlen,also Nullen und Einsen, umwandeln.
Hat jemand eine Idee wie man das macht? Wäre super wenn mir jemand das ganz genau erklären könnte, da ich nicht sooo viel von Delphi verstehe.

MfG countdown

Wolfgang Mix 23. Mär 2010 20:12

Re: Text in Dualzahlen umwandeln
 
Erstmal herzlich willkommen in der DP :dp:

Deine Frage verstehe ich, ehrlich gesagt, nicht.
Frage noch einmal genauer, bitte

alleinherrscher 23. Mär 2010 20:13

Re: Text in Dualzahlen umwandeln
 
Du möchtest einen Text in Binärzahlen umwandeln? Oder meinst du, du willst eine Dezimalzahl ins Binärsystem konvertieren? Ich frage mich, wie du auf die Idee kommst, sowas zu programmieren. Schule?

Die Muhkuh 23. Mär 2010 20:21

Re: Text in Dualzahlen umwandeln
 
Du könntest den jeweiligen Buchstabenwert in seinen Ordinalwert konvertieren und diesen Dual darstellen.

Wolfgang Mix 23. Mär 2010 20:23

Re: Text in Dualzahlen umwandeln
 
ASCII-Tabelle?

Fragen über Fragen

Genauere Fragen ergäben bessere Antworten.
[/Edit] Sage uns doch bitte, was du genau vorhast [/Edit]

countdown 23. Mär 2010 20:29

Re: Text in Dualzahlen umwandeln
 
Danke für die freundliche Begrüßung :-D

Also ich möchte gerne einen Text in ein Editfeld eingeben z.b. "Hallo".
Nun gib es doch die Möglichkeit die einzelnen Buchstaben als Folge von Nullen und Einsen darzustellen.
Dies möchte ich gerne machen und der umgewandelte Text soll dann wieder in dem Editfeld ausgegeben werden.
Ich stelle mir das ungefähr so vor, dass man mit einer for-Schleife durch den Text geht und dann eben jeder Buchstabe durch eine Folge von Nullen und Einsen ersetzt wird. Dafür müsste man dann natürlich iwo auflisten, welcher Buchstabe welche Folge von Nullen und Einsen hat.
Oder gibt es da vielleicht eine einfachere Lösung?
Zur Frage wie ich auf die Idee komme: Ich möchte gerne ein Verschlüsselungsverfahren umsetzten.Also einen Text in Dualzahlen umsetzten genauso wie einen Schlüssel, den man ebenfalls eingeben können soll, und den Text dann mit Hilfe des Schlüssels verschlüsseln.

@ die muhkuh: Wie gesagt ich versteh noch nicht so viel von Delphi..also versteh ich bei deiner Aussage nur Bahnhof^^

alleinherrscher 23. Mär 2010 20:36

Re: Text in Dualzahlen umwandeln
 
Wie bereits gesagt wurde, entspricht jeder Buchstabe einem ASCII-Wert. (Bei wiki mal nach ASCII-Tabelle suchen).

Die Idee mit der For-Schleife ist richtig. Den Wert eines Buchstabens bekommst du mit der Funktion Ord. Anschließend musst du nur noch den dezimalen Wert in einen Binären Wert umrechnen. Da würd ich mal im Forum suchen nach Binärzahl oder so, findet sich einiges zu.

Wolfgang Mix 23. Mär 2010 20:40

Re: Text in Dualzahlen umwandeln
 
Wie Die Muhkuh schon schrieb:

Nimm jeden Buchstaben, bilde mit ORD den ASCII-Wert dazu und wandle
die Integerzahl nach Dual um. Fertige Lösung dazu findest du in der
CodeLib.

Aphton 23. Mär 2010 21:46

Re: Text in Dualzahlen umwandeln
 
1.
Alle Zeichen werden (in der Computerwelt) durch eine bestimmte Zahl dargestellt.
Die Zahlen zu all den Zeichen findest du in der Ascii Tabelle
Per Ord() Function (in Delphi) ermittelst du den Ascii-Wert von einem Zeichen.
Folglich gäbe dir zb. Ord('A') den Wert 65 zurück.

2.
Für die duale Darstellung eines Dezimalzahls musst du nur umrechnen. Dazu gibt es bestimmte Vorgänge, die du selber nachrecherchieren solltest, da es wirklich nicht hier rein gehört.
Nachdem du das hast, kannst du dann, so wie du eh anfangs beschrieben hast, vorgehen:
Eine Schleife: Alle Zeichen des eingegebenen Strings (Textes) durchgehen und für jedes Zeichen den Ascii Wert ermitteln;
Die Dezimalzahl (Ascii-Wert, per Ord()) dann in eine Dualzahl verwandeln;

Hoffe dir auf einfachste Art und Weise geholfen zu haben =)

MfG

stho 24. Mär 2010 07:57

Re: Text in Dualzahlen umwandeln
 
schau mal hier:

Delphi-Quellcode:
  while sWert / 2 <> 0 do
  begin
    sAusgabe := IntToStr(sWert mod 2) + sAusgabe;
    sWert := sWert div 2;
  end;
sWert = Ascii-Wert eines Buchstaben
sAusgabe = Text der ins Edit-Feld kommen soll ^^

Damit kannst du eine Zahl in Binär umwandeln ;-)
(Wenn Fehler da sind, einfach bescheid geben oder korregieren ^^)
Achja, die Schleife prüft nicht ob pro Zeichen 8 Stellen geschrieben werden... Musst du gegebenenfalls nochmal überprüfen

Neutral General 24. Mär 2010 08:09

Re: Text in Dualzahlen umwandeln
 
Zitat:

Zitat von stho
schau mal hier:

Delphi-Quellcode:
  while sWert / 2 <> 0 do
  begin
    sAusgabe := IntToStr(sWert mod 2) + sAusgabe;
    sWert := sWert div 2;
  end;
sWert = Ascii-Wert eines Buchstaben
sAusgabe = Text der ins Edit-Feld kommen soll ^^

Da benutzt du schon Präfixe für deine Variablen (wovon ich (in der Form) kein Fan bin :P ) und dann auch noch falsch :mrgreen:
sWert müsste dann wohl eher ein bWert oder ein iWert sein :stupid:

guidok 24. Mär 2010 08:34

Re: Text in Dualzahlen umwandeln
 
Zitat:

Zitat von stho
(Wenn Fehler da sind, einfach bescheid geben oder korregieren ^^)

korregieren --> korrigieren :wink:

countdown 24. Mär 2010 12:04

Re: Text in Dualzahlen umwandeln
 
Hallo Leute!
danke für die ganzen Hilfen, aber iwie verzweifele ich im Moment schon an der Umwandlung eines Textes in die ascii-werte...

Hier mal etwas Quelltext:

Delphi-Quellcode:
Var
S: integer
ttext: string
begin
 For s:= 1 to length(ztext) do

begin
ttext:= inttostr(ord(ztext[s])); // ttext:= ttext + intostr(ord(ztext[s]));
end;

ztext:= ttext;

end;

ztext ist der in ein Editfeld eingegebene Text.
Nun möchte ich, dass jedes Zeichen von ztext in mit ord umgewandelt wird, dann zu einem string gemacht wird und als ttext gesetzt wird.Am Ende wird ztext dann zu ttext und ich kann mir ztext in einem editfeld wieder ausgeben lassen.
Das Problem ist aber dass bei der Lösung mit "ttext:= inttostr(ord(ztext[s]));" die eig ja nur für einen Buchstaben ist, da ttext ja sonst immer wieder neu überschrieben wird, auch bei unterschiedlichen Eingaben immer die selbe Zahl 116 zurückkommt.
Bei der Lösung // ttext:= ttext + intostr(ord(ztext[s])); , mit der man meiner meinung nach ja auch mehr zeichen umwandeln und wieder ausgeben können müsste, bekomme ich schon bei einer eingabe von nur einem zeichen eine 50-60 Stellige Zahl zurück!
Weiß da jemand Rat und könnte mir vielleicht zeigen wie es richtig gemacht wird?

guidok 24. Mär 2010 12:13

Re: Text in Dualzahlen umwandeln
 
Wo und wie rufst du denn deine Routine auf?

Grundsätzlich sollte die auskommentierte Variante schon funktionieren. Die nicht auskommentierte Variante müsste normalerweise den ASCII-Wert des letzten Zeichens in ztext liefern, da du zwar eine Schleife über alle Zeichen durchläufts, aber den ermittelten Wert immer wieder überschreibst.

countdown 24. Mär 2010 12:24

Re: Text in Dualzahlen umwandeln
 
ich habe eine "neueklasse" erstellt, die das attribut ztext und einige methoden u.a auch "textumwandeln" besitzt.
nun habe ich in der hauptunit ztext über die methode "setztetext" aus der klasse "neueklasse" den in ein editfeld eingegebenen Text zugewiesen und rufe dann über eine buttonclick methode die prozedure "textumwandeln" auf in der der angegebene Quelltext steht. Über eine Methode gibtext der klasse "neueklasse" lasse ich dann in der hauptunit ztext wieder in einem editfeld ausgeben.

Hoffe das ist verständlich formuliert^^

p80286 24. Mär 2010 12:41

Re: Text in Dualzahlen umwandeln
 
versuch es doch einmal mit dieser Simpellösung:
Delphi-Quellcode:
function Byte2Bin(inbyte:byte):string;
const
  bina:array [0..1] of char=('0','1');
begin
  result:='       ';
  result[1]:=bina[(inbyte shr 7) and $01];
  result[2]:=bina[(inbyte shr 6) and $01];
  result[3]:=bina[(inbyte shr 5) and $01];
  result[4]:=bina[(inbyte shr 4) and $01];
  result[5]:=bina[(inbyte shr 3) and $01];
  result[6]:=bina[(inbyte shr 2) and $01];
  result[7]:=bina[(inbyte shr 1) and $01];
  result[8]:=bina[(inbyte and $01)];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  for i:=1 to length(label1.caption) do
    label2.Caption:=label2.Caption+' '+Byte2Bin(byte(label1.Caption[i]));
end;
Gruß
K-H

guidok 24. Mär 2010 12:53

Re: Text in Dualzahlen umwandeln
 
Also bei mir funktioniert das problemlos:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var
    s: integer;
    ttext: string;
begin
  for s:= 1 to length(Edit1.Text) do
  begin
    ttext:= ttext + inttostr(ord(Edit1.Text[s]));
  end;

Label1.Caption := ttext;
end;

countdown 24. Mär 2010 13:02

Re: Text in Dualzahlen umwandeln
 
Danke p80286 auch wenn ich die funktion, die du mir gegeben hast, absolut nicht verstehe, konnte ich es zu laufen bringen indem ich es so in die hauptunit geschrieben habe:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var s:integer;
begin
 for s:= 1 to length(edit1.text) do
  label17.caption := label17.caption + inttostr(ord(edit1.text[s]))   ;
end;
was jetzt nicht verstehe ist warum das ganze nicht funktioniert, wenn ich das umwandeln in eine andere klasse auslagern will...
hat da noch jemand eine antwort drauf?wäre super wenn ihr mir das noch erklären könntet aber ich bin erstmal froh, dass es jetzt soweit bei mir klappt:) danke an alle

DeddyH 24. Mär 2010 13:13

Re: Text in Dualzahlen umwandeln
 
Was genau funktioniert denn nicht? :glaskugel:

countdown 24. Mär 2010 13:13

Re: Text in Dualzahlen umwandeln
 
alles klar hat sich erledigt, ich habe den fehler selber gefunden:P
danke nochmals an alle helfer

guidok 24. Mär 2010 13:37

Re: Text in Dualzahlen umwandeln
 
Zitat:

Zitat von countdown
alles klar hat sich erledigt, ich habe den fehler selber gefunden:P
danke nochmals an alle helfer

Und was war nu der Fehler?

countdown 24. Mär 2010 13:53

Re: Text in Dualzahlen umwandeln
 
war eigentlich ein dummer fehler..
ich hatte ztext seinen String aus dem Editfeld schon bei Formactivate zugewiesen und nicht erst bei der buttonclick procedure..dadurch wurde das, was zu Begin im EditFeld steht( bei mir war es "zu verschlüsselnder text") in Dezimale umgewandelt, was natürlich auch die 50-60 stellige Zahl erklärt :wink:

countdown 24. Mär 2010 15:10

Re: Text in Dualzahlen umwandeln
 
ich habe schon wieder ein neues Problem...
ich habe ja schon geschrieben, dass ich ein Verschlüsselungsverfahren nachstellen möchte.
Nun habe ich es also geschafft einen Text aus einem Editfeld und einen Schlüssel aus einem Editfeld in ascii-Werte zu verwandeln und diese jeweils in einem Label auszugeben.
Der nächste Schritt der folgen sollte und bei dem ich Probleme habe ist folgender:
Ich möchte nun die erste Zahl des Textes mit der ersten Zahl des Schlüssels addieren, die zweite zahl mit der Zweiten, usw...Dabei soll der Schlüssel sich wiederholen wenn der Text länger ist als der Schlüssel..aber gehen wir zuerst von gleichlangen Text und Schlüssel aus.
Beispiel:
Text: 103104
Schlüssel: 871055
verschlüsselter Text: 974159

ich habe auch wieder einen Versuch gestartet aber habe keine ahnung ob das ein richtiger ansatz ist:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

Var
schluessel,text,b:integer;
begin
text:= strtoint(Label1.caption);  //in Label1.caption steht der in zahlen umgewandelte Text
schluessel:= strtoint(Label2.caption);// in label2.caption steht der in zahlen umgewandelte schlüssel

for b:=1 to length(Label1.caption) do
    begin
    Label3.caption:= Label3.caption + (inttostr( text[b] + schluessel[b]));  // in label3.caption soll der verschlüsselte Text
                                                                              // ausgegeben werden
     end;

 end;

end;
er zeigt mir immer eine Fehlermeldung an, dass bei text[b] und schluessel[b] ein array-typ erforderlich ist...ich hab aber keine ahnung was das ist..kann mir also jemand sagen ob das was ich da gemacht hab richtig ist und wenn ja wie das mit dem array-typ ist und wie man den da einbaut?

guidok 24. Mär 2010 15:26

Re: Text in Dualzahlen umwandeln
 
Naja, im einfachsten Fall probier es doch mal so:

Delphi-Quellcode:
(IntToStr( StrToInt(text[b]) + StrToInt(schluessel[b])))
Für den Schlüssel musst du dann natürlich eine separate Indexvariable nehmen, die von 1 bis Length(Schluessel) - 1 gezählt wird und dann wieder bei 1 beginnt.

Ein kleiner Tip noch: Überleg dir bevor du programmierst erst mal auf einem Blatt Papier was du machen willst und wie es funktionieren könnte.

Ein Problem, über das du evtl. noch stolpern wirst, wird vielleicht folgendes:

Zitat:

verschlüsselter Text: 974159
Ich nehme an, du willst das auch irgendwann mal entschlüsseln, oder?

Wie stelltst du jetzt fest, was die codierte Repräsentation des ersten Zeichens deines Klartextes ist?

Das Ergebnis deiner Addition muss ja nicht zwangsweise zweistellig sein...

DeddyH 24. Mär 2010 15:29

Re: Text in Dualzahlen umwandeln
 
Zitat:

Zitat von guidok
Naja, im einfachsten Fall probier es doch mal so:

Delphi-Quellcode:
(IntToStr( StrToInt(text[b]) + StrToInt(schluessel[b])))

Dazu darf der Schlüssel aber nicht kürzer als der Text sein, das muss man abfangen.

runningsoft 24. Mär 2010 15:37

Re: Text in Dualzahlen umwandeln
 
Hallo,

Du wandelst jetzt den Text aus Label1 und Label2 in Integerzahlen um (also der String '10324' wird zu 10324). Da kannst Du natürlich nicht mit der von Dir verwendeten Methode die beiden ersten zahlen addieren, dann die zweiten usw. Dazu müsstest Du die Variablen Text und Schlüssel als Strings definieren.

Folgender Code sollte funktionieren (ungetestet, hab grad kein Delphi zur Hand):

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

Var
b:integer;
schluessel,text : string;
begin
text:= Label1.caption;  //in Label1.caption steht der in zahlen umgewandelte Text
schluessel:= Label2.caption;// in label2.caption steht der in zahlen umgewandelte schlüssel

for b:=1 to length(Label1.caption) do
    begin
    Label3.caption:= Label3.caption + (inttostr(strtoint(text[b]) + strtoint(schluessel[b])));  // in label3.caption soll der verschlüsselte Text
                                                                              // ausgegeben werden
     end;

end;

end;

countdown 24. Mär 2010 15:57

Re: Text in Dualzahlen umwandeln
 
@runningsoft und alle andern:danke für die hilfe es funktioniert:)

@guidok: den tip mit dem Blatt kenn ich schon und wende ihn auch nach bestem gewissen an :wink:
natürlich möchte ich das auch irgendwann wieder entschlüsseln aber ich verstehe das Problem das du ansprichst leider nicht..

countdown 24. Mär 2010 16:15

Re: Text in Dualzahlen umwandeln
 
ich habe aber jetzt erstmal ein anderes Problem gelöst:
wenn ich das berücksichtig habe was ihr mir geraten habt war die Summe der Zahlen immer länger als der text bzw der schlüssel, da 9+5= 14 und dann auch 14 ausgegeben wurde.
Deshalb habe ich nun eine if-schleife eingebaut die verhindert dass zahlen >9 ausgegeben werden.wenn eine Zahl größer 9 ist wird sie minus 10 gerechnet und dann ausgegeben:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

Var
schluessel,text:string;
b,zwischenwert:integer;
begin
text:= Label1.caption;
schluessel:=Label2.caption;

for b:=1 to length(Label1.caption) do
    begin
    zwischenwert:= ( StrToInt(text[b]) + StrToInt(schluessel[b]));
    if zwischenwert > 9
    then zwischenwert:= zwischenwert -10;
    label3.caption:= label3.caption + inttostr(zwischenwert);
     end;

 end;
für die entschlüsselung wird dann der verschlüsselte text minus den schlüssel genommen und sollte das ergebnis dann <0 sein wird +10 gerechnet so dürfte ich doch dann wieder auf meinen ausgangstext kommen oder?

p80286 24. Mär 2010 16:17

Re: Text in Dualzahlen umwandeln
 
Ist doch relativ einfach:
Wenn Du ein Zeichen (Byte) binär darstellen willst, bekommst Du einen String der 8 Zeichen Lang ist.
also so etwas 01010100.
Delphi-Quellcode:
Result:='       ';
dann werden alle Bits von "oben" nach "unten" (most signigficant/least significant ?)
in den String übertragen:
Delphi-Quellcode:
  result[1]:=bina[(inbyte shr 7) and $01];
  result[2]:=bina[(inbyte shr 6) and $01];
  result[3]:=bina[(inbyte shr 5) and $01];
  result[4]:=bina[(inbyte shr 4) and $01];
  result[5]:=bina[(inbyte shr 3) and $01];
  result[6]:=bina[(inbyte shr 2) and $01];
  result[7]:=bina[(inbyte shr 1) and $01];
  result[8]:=bina[(inbyte and $01)];
mit shr schiebst Du das zu verwertende Bit an die letzte Stelle und maskierst es mit $01.Wobei das $01 sicher stellt, daß immer 0 oder 1 als Ergebnis heraus kommt (eben das aktuell letzte Bit).
Und das nimmst Du als Index für ein Array (bina), das nur 0 und 1 enthält. So wird der Zahlenwert 0 als Ziffer 0 dargestellt und der Wert 1 als 1.
Delphi-Quellcode:
const
  bina:array [0..1] of char=('0','1');
Ich hoffe das ist verständlich
K-H

DeddyH 24. Mär 2010 16:48

Re: Text in Dualzahlen umwandeln
 
Zitat:

Zitat von countdown
Deshalb habe ich nun eine if-schleife eingebaut

If-Schleife


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 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