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];

意味着为给定数量的字符动态分配一块内存,比msg字符串的原始长度大 3 倍 + 1。

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'。

有关 C++ 运算符的更多信息,请new[] 点击此处

于 2012-12-05T09:30:12.810 回答
1

它是一行 C++,它动态分配一个字符数组 3 倍于字符串“msg”的长度 + 1 倍(对于空终止符)

于 2012-12-05T09:30:36.920 回答
1

这是 C++,代码分配了一个 char 数组,其大小是消息长度的 3 倍加一。结果指针被分配给intmsg

为什么这样做?因为消息在循环中逐个字符转换为每个字符的三位十进制数,带有sprintf(tmps,"%03d",tmp);.

于 2012-12-05T09:31:03.800 回答
0

这是 C++ 代码:

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

这告诉编译器为内存块的长度创建内存,intmsgheap等于“长度的 3 倍以上msg”。

表示在执行此行后intmsg开始指向内存块heap

于 2012-12-05T09:31:08.830 回答