字符指针在附加字符串字符时添加随机值

时间:2019-02-23 07:17:27

标签: c

我正在使用以下代码来打印md5并创建一个字符串

char *hash = (char*)malloc(32 * sizeof(char));
unsigned *d = md5(msg, strlen(msg));
MD5union u;
printf("\n\n\nThe MD5 code for input string is : \n");
for (j=0;j<4; j++){
    u.w = d[j];
    for (k=0;k<4;k++) 
    {
        char *mVal = (char*)malloc(sizeof(char));
        sprintf(mVal, "%02x",u.b[k]);
        strcat(hash, mVal);
        printf("%02x",u.b[k]);
    }
}

printf("\n\n\nThe MD5 code for input string is :%s \n", hash);

我的输出是

The MD5 code for input string is : 
187ef4436122d1cc2f40dc2b92f0eba0


The MD5 code for input string is :p��187ef4436122d1cc2f40dc2b92f0eba0 

为什么我的哈希值中还有p��

1 个答案:

答案 0 :(得分:2)

hash未初始化。它可以具有任何初始值。 strcat 附加数据。如果hash中有某些内容被视为以null结尾的字符串,则不会将其删除。使用之前,请使用strcpy或对hash进行零初始化。

除此之外,您的代码还有多个错误和未定义的行为。

  1. malloc(32 * sizeof(char));在包含空终止符时为31个(非32个)字符长度的字符串分配内存。如果要将md5作为字符串存储在那里,请分配33个字节的内存。
  2. char *mVal = (char*)malloc(sizeof(char)); sprintf(mVal, "%02x",u.b[k]);-指向mVal的内存中有长度为0(不是1,不是2,而是零)的字符串。您是否希望将sprintf, "%02x"的输出存储到变量中,是否至少分配3个字节的内存-第一个字节用于第一个十六进制数字,第二个字节用于第二个十六进制数字,第三个字节用于空终止符。 / li>
  3. char *mVal = (char*)malloc(sizeof(char));在超出范围之前无处释放,只会泄漏内存。
  4. 好像您正在使用md5hash.c。该函数返回指向static存储器的指针。这很糟糕,因为它会使函数不能重入。
  5. 您的程序可以重写为: char *hash = malloc(33); unsigned *d = md5(msg, strlen(msg)); snprintf(hash, 33, "%08x%08x%08x%08x", d[0], d[1], d[2], d[3]);。打印十六进制时,几乎不需要将unsigned int转换为unsigned char,可以直接使用%08x转换为unsigned char。当int作为参数传递时,printf会转换回sprintf。您可以直接将hash放入unsigned int,而无需临时变量。
  6. 使用联合在char *d_as_char = (void*)d;数组与字节之间进行转换感觉像是对该工具的滥用。 (在大多数系统上)您只需将指针d_as_char强制转换为4 * sizeof(int)长度的char数组即可访问memcpy。如果您确实不想在代码中出现未定义的行为和别名问题,请使用char d_as_array[sizeof(int) * 4]; memcpy(d_as_array, d, sizeof(d_as_array));方式:if($items.length <= 20 ){ $loadMoreBtn.hide(); }