ASCII-Umwandlung funktioniert nicht
-
Ich wollte ein kleines Programm schreiben, welches eine vorzeichenlose Ganzzahl in eine zufällige Kombination von Symbolen umwandelt, deren Summe der ASCII-Werte wieder der Ausgangszahl entspricht. Dasselbe sollte dann auch noch rückwärts funktionieren. Als eine Art Verschlüsselung gedacht, funktioniert das Entschlüsseln sehr wohl, nur andersrum geht's nich. Hier der Code:
private void encrypt_Click(object sender, EventArgs e) { Random rnd = new Random(); string crypt = ""; int number = 0; try { number = Convert.ToInt32(decrypted.Text); } catch (Exception ex) { MessageBox.Show("Please enter a valid unsigned integer."); } while (number > 0) { int max = 95; if (number < 94) max = number++; int diff = 1; if (number < 1) { diff = rnd.Next(max); } if (diff == 0) { diff = 1; } number = number - diff; diff = diff + 32; crypt = crypt + (char)diff; }; encrypted.Text = crypt; }
Zuerst dachte ich, das Problem liege in den Steuerungszeichen (ASCII-Tabelle, Plätze 0-31 und 127). Deshalb verwende ich auch nur 32 - 126.
Das Problem besteht nun darin, dass ich keine Fehlermeldung bekomme (die man dann analysieren könnte), sondern viel eher das Programm bei jeder gültigen Eingabe über 0 einfach keine Rückmeldung mehr gibt.
Was mache ich also falsch? Über aufschlussreiche Korrekturen würde ich mich sehr freuen
-
So, hab mich mal registriert (und den Code nochmal ein wenig abgeändert, was allerdings nichts am Problem ändert).
private void encrypt_Click(object sender, EventArgs e) { Random rnd = new Random(); StringBuilder crypt = new StringBuilder(); int number = 0; try { number = Convert.ToInt32(decrypted.Text); } catch (Exception ex) { MessageBox.Show("Please enter a valid unsigned integer."); } while (number > 0) { byte max = 95; if (number < 94) max = Convert.ToByte(number++); byte diff = 1; if (number > 1) { diff = (byte)rnd.Next(max); } if (diff == 0 || diff == 1) { diff = 1; } number = number - diff; crypt.Append(Convert.ToString(diff + 32)); }; encrypted.Text = crypt.ToString(); }
Und
-
Ziemlich undurchsichtig, dein Code. Was soll denn
max = number++;
?
Präzisiere doch mal verständlich, was du genau erreichen willst (und warum ausgerechnet auf
encrypt_Click(object sender, EventArgs e
)).
-
Na schön:
Ich möchte eine vorzeichenlose Ganzzahl (z.B 293) in eine Zeichenfolge umwandeln.
Die Summe der ASCII-Werte* der einzelnen Zeichen dieser Zeichenfolge soll dann wieder die Ausgangszahl ergeben.Also:
Eingangswert ist eine vorzeichenlose Ganzzahl, eingegeben in eine Textbox (decrypted.Text).
Die wird nun in int umgewandelt (number).Von number wird nun ein zufälliger Wert von 0 - 94 (diff) abgezogen.
Für den Fall, das evtl. zufällig ein höherer Wert als number für diff generiert werden könnte (max > number), wird der Wert von max angepasst.
diff wird nun als ASCII-Code behandelt und wird in ein Zeichen umgewandelt, welches dann an den StringBuilder crypt angehängt wird.
Dies wird solange wiederholt bis number = 0 ist.
Dann wird crypt in einer weiteren TextBox ausgegeben.Anmerkung: Ich kann die ASCII-Codes nicht direkt verwenden, da die Werte 0 - 31 und 127 an Steuerungszeichen vergeben sind, die sich leider nicht so einfach als String darstellen lassen. Deswegen addiere ich zu diff jedesmal 32.
Naja, zumindest sollte es so sein...
warum ausgerechnet auf encrypt_Click
Wo denn sonst?
-
schmidt-webdesign.net schrieb:
Was soll denn
max = number++;
?
Mir ist bei der Überwachung einzelner Variablen aufgefallen, dass das eine sehr gute Frage ist... Da lag der Fehler.
Eigentlich sollte es heissen:max = number+1;
Ne andere Frage: Kann mir jemand verraten wie ich das anstelle, dass die GUI während der Berechnung weiter auf Eingaben (z.B. ein Cancel-Button) reagiert?
-
Dazu müßtest du Threads bzw. besser den BackgroundWorker benutzen.
-
asciibuster schrieb:
Ne andere Frage: Kann mir jemand verraten wie ich das anstelle, dass die GUI während der Berechnung weiter auf Eingaben (z.B. ein Cancel-Button) reagiert?
Asynchrone Methodenaufrufe können meist vermieden werden, wenn die verwendeten Lösungsverfahren des Problems überarbeitet und optimiert wurden. Vielfach benötigt das Programm nämlich das Ergebnis umfangreicher Berechnungen für die Weiterverarbeitung (muss also eh warten). Manchmal lohnt sich aber auch (die lange geplante) Neuanschaffung des längst überfälligen 6-Kern-Rechners mit 16 GB RAM ...
-
schmidt-webdesign.net schrieb:
Manchmal lohnt sich aber auch (die lange geplante) Neuanschaffung des längst überfälligen 6-Kern-Rechners mit 16 GB RAM ...
Tatsächlich ist der Rechner mit dem ich aktuell arbeite nicht gerade der beste (liegt aber nur daran, dass der andere kaputt ist). Ich meinte eher, wie man z.B. die Generierung einer zufälligen, 100.000stelligen Zeichenfolge abbrechen kann, ohne gleich das Programm zu beenden...
Ist aber nicht dringend, war eher etwas was mir aufgefallen ist als ich meinen Code mit mit höheren Eingabewerten (die dann als Ausgabe einen String mit einer Datenmenge von über 13,8 MB hatten) getestet habe.