1

私はCを使い始めたばかりで、コードでRSA暗号を使用することに取り組んでいます。ただし、このコード行は私を混乱させます。クレジットはここのこのサイトから作者に送られます。

char* intmsg = new char[strlen(msg)*3 + 1];

これは、線を見つけることができる方法です。

inline void encrypt(char* msg,FILE* fout)
{
    /* This function actually does the encrypting of each message */

    unsigned int i;
    int tmp;
    char tmps[4];
    char* intmsg = new char[strlen(msg)*3 + 1];


    /* Here, (mpz_t) M is the messsage in gmp integer 
    *  and (mpz_t) c is the cipher in gmp integer */

    char ciphertext[1000];

    strcpy(intmsg,"");

    for(i=0;i<strlen(msg);i++)
    {
        tmp = (int)msg[i];

        /* print it in a 3 character wide format */
        sprintf(tmps,"%03d",tmp);

        strcat(intmsg,tmps);
    }

    mpz_set_str(M,intmsg,10);

    /* free memory claimed by intmsg */
    delete [] intmsg;

    /* c = M^e(mod n) */
    mpz_powm(c,M,e,n);

    /* get the string representation of the cipher */
    mpz_get_str(ciphertext,10,c);

    /* write the ciphertext to the output file */
    fprintf(fout,"%s\n",ciphertext);
}
4

5 に答える 5

7

そのコード行は実際にはCではなく、C++です。

    char* intmsg = new char[strlen(msg)*3 + 1];

文字列の元の長さの3倍+1の、指定された文字数のスペースを持つメモリブロックを動的に割り当てることを意味しmsgます。

Cの同等物は

    char* intmsg = malloc(strlen(msg)*3 + 1);

そのメモリブロックの割り当てを解除するにdelete []intmsgは、C ++で使用されますがmalloc、Cで使用した場合は、free(intmsg);

于 2012-12-05T09:30:33.913 に答える
2

格納されている文字のリストの3倍にmsg加えて、文字列終了文字'\0'を格納するための1文字の配列を作成します。

C ++演算子の詳細については、new[] こちらをご覧ください

于 2012-12-05T09:30:12.810 に答える
1

そのC++の行、および文字列 "msg"の長さの3倍+1以上のcharの配列を動的に割り当てます(ヌルターミネータの場合)

于 2012-12-05T09:30:36.920 に答える
1

これはC++であり、コードはcharの配列を割り当てます。そのサイズは、メッセージの長さの3倍に1を加えたものです。結果のポインタはに割り当てられintmsgます。

なぜそれをするのですか?メッセージは文字ごとに変換されるため、。を使用してループ内で1文字あたり3桁の10進数に変換されますsprintf(tmps,"%03d",tmp);

于 2012-12-05T09:31:03.800 に答える
0

それはc++コードです:

char* intmsg = new char[strlen(msg)*3 + 1];

これは、メモリブロックの長さ、つまり「の長さの3倍より1つ多い」に等しい長さのメモリintmsgを作成するようにコンパイラに指示します。heapmsg

この行の実行後、intmsg上のメモリブロックを指し始めたことを意味しheapます。

于 2012-12-05T09:31:08.830 に答える