string für Berechnungen umwandeln
-
Hallo zusammen,
schon seit Monaten plackt mich ein Problem und ich habe noch keine optimale Lösung gefunden. Für einen Verschlüsselungsalgorithmus muss ich einen std::string auf ein unsigned long abbilden. Die Berechnungen des Algorithmus sind nicht string kompatibel.
Die gängigen Umwandlungssachen gehen (natürlicherweise) davon aus dass nur Zahlen in dem string stehen, bei ner Verschlüsselung sinds natürlich auch Buchtsaben.
Zur Zeit wandle ich das Zeichen für Zeichen in ASCII Code um und "schreib" die quasi zu ner Zahl hintereinander. Also aus "AB" wird zum Beispiel die Zahl "6162". Das ist aber subotimal und gibt einige Probleme.
Hoffe das Problem ist verständlich und jemand weiss ne elegante Lösung.
-
wolfcastle schrieb:
Also aus "AB" wird zum Beispiel die Zahl "6162". Das ist aber subotimal und gibt einige Probleme.
Hoffe das Problem ist verständlich und jemand weiss ne elegante Lösung.Wo ist denn genau das Problem? Das ist ne 1zu1 Umwandlung von Text in Zahl. Jeder Zahl entspricht genau ein Text und umgekehrt auch. Natürlich sind andere Kodierungen denkbar, aber diese ist doch eigentlich einfach und elegant. Was genau macht denn dann Schwierigkeiten?
-
Das Hauptproblem ist die dadurch entstehende Variable Länge des unsigned long. Da ja ASCII 2 oder 3 stellig sein können. Und da es keine führende Null gibt, ist die resultierende Länge des unsigned long Variabel. Zum besseren verständnis die Implementierung der Umrechnung momentan:
unsigned long PT; string text; //Transform string into long unsigned for(int j=0;j<text.length();j++) { PT = PT*1000; PT=PT+text.at(j); }
-
Das kommt davon dass Du das Gebilde "Zahl" aus seinem binären Kontext herausreisst und in das weltliche Dezimalsystem presst. Im binären Kontext hat doch jedes Zeichen genau acht Stellen und jede (32-bit) Zahl genau 32 Stellen, das passt ganz prima

char x[5] = "abcd"; // 5 wegen nullbyte int y = *(int*)x;
-
Hmm das klappt ja tatsächlich.
Das mit dem binären Kontext war mir auch bewusst, deswegen suchte ich eine bessere Lösung. Dachte jedoch nicht, dass das über ein einfaches tycast funktioniert. Wenn mir jetzt noch jemand erklärt, wie das intern genau funktioniert (also was er da macht) bin ich glücklich :).PS: Naja klappt doch nich ganz. Irgendwie kommt bei zweimal das selbe Typecasten zwei verschiedene Sachen raus, schon merkwürdig.
-
Nimm mal 4 Asciizeichen und schreib Dir deren Werte auf. Jetzt schreibst Du die 4 mal binär alle hintereinander. Anschließend rechnest Du mal aus, was passiert, wenn Du diesen Salat aus 32 Bits jetzt als Zahl interpretierst. Genau das tut der Rechner. Da der aber sowieso mit der Binärdarstellung arbeitet muß er nichtmal umwandeln sondern kann einfach dei Interpretation (mit dem cast) ändern.
-
Ah danke das Prinzip klingt gut. Mein problem löiegt wohl wonaders im Code, naja auf jeden Fall habt ihr mir geholfen, thx.
-
Hmm jetzt hab ich doch noch nen Problem damit. Hab nen bissel rumprobiert und nicht geschafft das ganze wieder umzudrehen.
Der folgende Code liefert nen illegalen TypeCast:char x[5] = "abcd"; // 5 wegen nullbyte int y = *(int*)x; x=*(char*[5])y;Gibt es für das Rückumwandeln auch ne Möglichkeit oder is das ganze ne Einbahnstrasse?
-
Zurück gehts so
#include <stdio.h> #include <stdlib.h> int main() { char x[5] = "abcd"; // 5 wegen nullbyte int y = *(int*)x; printf("%s\n", x ); printf("%d\n", y ); y+=1; // leicht ändern *(int*)x=y; x[4]=0; // um sicher zu sein printf("%s\n", x ); }Kurt
-
*verwirrt schau* Okay das klappt, kann mir auch jemand erklären warum ich den Typecast indem Fall auf der linken Seite machen muss?
Btw ist bei mir die Erhöhung um 1 nicht notwendig, führt sogar zum falschen Ergebniss ("bbcd"). Warum hast du sie also eingebaut?
-
wolfcastle schrieb:
*verwirrt schau* Okay das klappt, kann mir auch jemand erklären warum ich den Typecast indem Fall auf der linken Seite machen muss?
Btw ist bei mir die Erhöhung um 1 nicht notwendig, führt sogar zum falschen Ergebniss ("bbcd"). Warum hast du sie also eingebaut?Die Erhöhung hab ich nur eingebaut damit du sicher sein kannst dass nicht wieder der ursprüngliche String ausgegeben wird ( ist natürlich unnötig ).
Warum der cast auf der linken Seite ?. Keine Ahnung. Weil's sonst nicht funktioniert ? ( gibt sicher eine technischere Erklärung,hab aber momentan nicht den Kopf dazu mir das zu überlegen )
Kannst auchmemcpy(x, &y, sizeof(int));verwenden. Dann brauchst du gar keinen cast.
Kurt
EDIT:
Die technischere Erklärung is dass eine Zuweisung an ein char array mittls = operator nicht funktioniert.
zbchar buffer[5]; buffer = "abcd"; // fehler