我正在使用以下代码来打印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��
个
答案 0 :(得分:2)
hash
未初始化。它可以具有任何初始值。 strcat
附加数据。如果hash
中有某些内容被视为以null结尾的字符串,则不会将其删除。使用之前,请使用strcpy
或对hash
进行零初始化。
除此之外,您的代码还有多个错误和未定义的行为。
malloc(32 * sizeof(char));
在包含空终止符时为31个(非32个)字符长度的字符串分配内存。如果要将md5作为字符串存储在那里,请分配33个字节的内存。char *mVal = (char*)malloc(sizeof(char));
sprintf(mVal, "%02x",u.b[k]);
-指向mVal
的内存中有长度为0(不是1,不是2,而是零)的字符串。您是否希望将sprintf, "%02x"
的输出存储到变量中,是否至少分配3个字节的内存-第一个字节用于第一个十六进制数字,第二个字节用于第二个十六进制数字,第三个字节用于空终止符。 / li>
char *mVal = (char*)malloc(sizeof(char));
在超出范围之前无处释放,只会泄漏内存。static
存储器的指针。这很糟糕,因为它会使函数不能重入。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
,而无需临时变量。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();
}