ROT 13 Codierung von Zeichen



  • Hey Leute, ich habe einen Text vor mir der mit ROT 13 codiert ist. Nun möchte ich den gerne entschlüsseln. Dafür habe ich mir einen Encoder geschrieben. Leider kann ich in diesen Encoder nur einzelne Character eingeben. Ist es mit einfachen Mitteln möglich, ganze Zeichenketten zuzulassen?

    Hier ist mein Code.

    /* Encoder to encode the task
     * 
     */
    
    /* 
     * File:   main.c
     * Author: Epi
     *
     * Created on 18. Mai 2016, 23:05
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    #define FIRST_CAPITAL 'A'
    #define LAST_CAPITAL 'Z'
    #define FIRST_SMALL 'a'
    #define LAST_SMALL 'z'
    #define LETTERS 57
    #define ROT 13
    
    char encrypt(char string); 
    void tester (void);
    
    int main(int argc, char** argv) {
    
        tester ();
    
        return (EXIT_SUCCESS);
    }
    
    char encrypt(char string){
        if (string >= 'FIRST_CAPITAL' && string <= 'LAST_CAPITAL'){
            if (string >= LAST_CAPITAL - ROT){
                return ROT - (LAST_CAPITAL - string) + FIRST_CAPITAL - 1;
            }
            return string + ROT;
        }
    
        else if (string >= LAST_SMALL - ROT){
            return ROT - (LAST_SMALL - string) + FIRST_SMALL - 1;
        }
        return string + ROT;
    }
    
    void tester (void){
    
        assert(encrypt('a') == 'n');
        assert(encrypt('A') == 'N');
        assert(encrypt('z') == 'm');
        assert(encrypt('x') == 'k');
        assert(encrypt('Z') == 'M');
    
        printf ("You are awesome!");
    }
    


  • C_Newbe schrieb:

    Ist es mit einfachen Mitteln möglich, ganze Zeichenketten zuzulassen?

    Ja.



  • Swordfish schrieb:

    C_Newbe schrieb:

    Ist es mit einfachen Mitteln möglich, ganze Zeichenketten zuzulassen?

    Ja.

    😃 😃 😃
    Haha, zu gut, okay, was muss ich machen damit es möglich wird?



  • Ruf Deine Funktion in einer Schleife auf.



  • SG1 schrieb:

    Ruf Deine Funktion in einer Schleife auf.

    Ja daran habe ich auch gedacht, ich habe allerdings um die 1000 Zeichen, die ich nicht gerne nacheinander abtippen möchte um diese encoden.

    Ich würde am Liebsten gerne die ganzen Sätze in einer Art string speichern und den durch meine Funktion laufen lassen. Ist das auch mit einer Schleife so möglich?

    Weil so wie ich das gerade überlege, müsste ich jedes einzelne Zeichen in einem char array speichern damit das funktioniert.

    Also so stelle ich mir das vor.

    char [3] {t,e,s,t}
    

    Das wäre in der Art und Weise super aufwendig, gibt es alternativen dazu?



  • char string[] = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.";



  • const char test[] = "hello world";
    
    const char *p = test;
    
    while (*p)
    {
      char encrypted = encrypt(*p);
    
      putchar(encrypted);
    
      ++p;
    }
    


  • Th69 schrieb:

    const char test[] = "hello world";
    
    const char *p = test;
    
    while (*p)
    {
      char encrypted = encrypt(*p);
    
      putchar(encrypted);
    
      ++p;
    }
    

    😮

    Coole Idee, also läuft quasi der pointer solange durch, solange er auf das Array zeigt? Verstehe ich das richtig?



  • Solange p nicht auf das den String abschließende '\0' zeigt.



  • Swordfish schrieb:

    Solange p nicht auf das den String abschließende '\0' zeigt.

    Dann wäre *p = 0 und somit while = false?



  • '\0' == 0 . Null ist immer false , ein von 0 unterschiedlicher wert immer true .



  • C_Newbe schrieb:

    Also so stelle ich mir das vor.

    char [3] {t,e,s,t}
    

    Das ist schon mal ein genialer Ansatz -> 4 + '\0' in ein 3 char großes array zu packen.
    Weiter so, du befindest dich auf einem vielversprechenden Weg.



  • unsigned char CSimpleCryptDlg::EncryptChar( int ch )
    {
    	int ret, diff;
    	if( ch >= 97 && ch <= 122 )
    	{
    		ret = ch + m_diff;
    		if( ret < 97 )
    		{
    			diff = 97 - ret;
    			ret = 123 - diff;
    		}
    		else if( ret > 122 )
    		{
    			diff = ret - 123;
    			ret = 97 + diff;
    		}
    		return( static_cast<unsigned char> (ret) );
    	}
    	else if( ch >= 65 && ch <= 90 )
    	{
    		ret = ch + m_diff;
    		if( ret < 65 )
    		{
    			diff = 65 - ret;
    			ret = 91 - diff;
    		}
    		else if( ret > 90 )
    		{
    			diff = ret - 91;
    			ret = 65 + diff;
    		}
    		return( static_cast<unsigned char> (ret) );
    	}
    	else
    		return( static_cast<unsigned char> (ch) );
    }
    

    So geht das. m_diff ist der Verschiebewert, klappt nicht nur mit ROT13.
    Decrypt funktioniert genauso, du musst nur einen negativen Wert für m_diff benutzen.



  • Ihh, mach das tot, bevor es Eier legt.

    C++ und Magic Numbers. 🙄



  • Würde man char32_t nutzen, würde das integer-gepfriemel auch wegfallen.



  • DirkB schrieb:

    Ihh, mach das tot, bevor es Eier legt.

    C++ und Magic Numbers. 🙄

    Hihihi, das wird wohl niemand mehr aus mir rauskriegen.
    Ich mach das seit 30 Jahren so und es wird schon irgendeinen Grund gehabt haben wieso ich einen int übergebe.
    Bin hier ja schließlich nicht bei einer CastingShow.



  • Hihi.



  • Sind die static_cast<>() s nicht redundant, wenn der Rückgabetyp sowieso unsigned char ist?

    aja, und hier ist doch C?

    #include <ctype.h>
    
    char rotate_char( char ch, int distance )
    {
    	if( !isalpha( ch ) )
    		return ch;
    
    	while( distance < 0 )
    		distance = 'Z' - 'A' + distance + 1;
    
    	char base = isupper( ch ) ? 'A' : 'a';
    	return base + ( ch - base + distance ) % ( 'Z' - 'A' + 1 );
    }
    
    void rotate_string( char * str, int distance )
    {
    	for( ; *str; ++str )
    		*str = rotate_char( *str, distance );
    }
    
    void rot13( char * str )
    {
    	rotate_string( str, 13 );
    }
    


  • EOP schrieb:

    C_Newbe schrieb:

    Also so stelle ich mir das vor.

    char [3] {t,e,s,t}
    

    Das ist schon mal ein genialer Ansatz -> 4 + '\0' in ein 3 char großes array zu packen.
    Weiter so, du befindest dich auf einem vielversprechenden Weg.

    Dieser raue Ton gefällt mir nicht (wenn ich den Sarkasmus richtig verstehe). Ich gebe mir wirklich Mühe mich im Eigenstudium mit den Sachen zu beschäftigen, da ist es nicht hilfreich solche abwertenden und polemischen Kommentare zu lesen.

    Ich habe gelernt man fängt bei 0 an zu zählen, wenn "test" in einem array gespeichert werden soll sind das genau 4 bytes an Inhalt, also ist das array 4 lang, quasi von 0-3.

    Wenn der /0 Byte mit initiiert werden muss (was ich gerade nicht glaube, aber gerne nochmal überprüfe) dann weise mich doch einfach darauf hin als hier so einen Pessimismus an den Mann zu bringen. Mit solchen Kommentaren zerstört man doch eher die Motivation derer, die sich bemühen aus eigener Kraft mit so etwas zu beschäftigen.

    Ich danke allen anderen für die Hinweise, der Trick mit der Pointer Schleife hat es perfekt erledigt. Zusätzlich habe ich noch den encrypter nur auf Buchstaben gestellt und habe einen perfekten Text bekommen.

    Ich freu mich 🙂 😃 👍



  • C_Newbe schrieb:

    Wenn der /0 Byte mit initiiert werden muss (was ich gerade nicht glaube, aber gerne nochmal überprüfe) [...]

    Zeichenketten in C (und C++, "C-Strings") sind per konvention Nullterminiert. Alle Funktionen, die in C mit Strings umgehen, verlassen sich darauf, daß irgendwann ein '\0' das Ende der Zeichenkette anzeigt.

    Der Compiler hängt dir freundlicherweise an "test" die '\0' automatisch an. In Wirklichkeit steht da also 't', 'e', 's', 't', '\0' .

    Initialisierst Du ein char -Array mit einem Zeichenkettenliteral

    char foo[] = "test";

    so ist dieses array also nicht 4 sondern 5 char s lang.

    Gibst Du die Größe des Arrays explizit an

    char foo[4 /* <- zu klein */ ] = "test";

    so ist schlicht kein Platz mehr für das fünfte Zeichen, die '\0' , und das ding ist zwar ein Array of char aber per Konvention kein gültiger C-String, da die Abschließende '\0' fehlt.

    char foo[] = { 't', 'e', 's', 't' };
    und
    char foo[4] = { 't', 'e', 's', 't' };

    fehlt auch die '\0'

    ➡

    char foo[] = { 't', 'e', 's', 't', '\0' };

    😉


Anmelden zum Antworten