C 在32位数组上复制16位哈希
我在使用C 在32位数组上复制16位哈希,c,hash,printf,strcat,C,Hash,Printf,Strcat,我在使用sprintf和strcat时遇到问题。这是我的密码: unsigned char hashResults[8][16]; unsigned char tmp[2]; unsigned char hash[8][32]; transformation("toto", 4, hashResults); for (int k = 0; k < 8; ++k) { for (int i = 0; i < 16; ++i) { sprintf(tm
sprintf
和strcat
时遇到问题。这是我的密码:
unsigned char hashResults[8][16];
unsigned char tmp[2];
unsigned char hash[8][32];
transformation("toto", 4, hashResults);
for (int k = 0; k < 8; ++k)
{
for (int i = 0; i < 16; ++i)
{
sprintf(tmp,"%2.2x",hashResults[k][i]);
strcat(hash[k],tmp);
}
printf("%d \n%s\n", strlen(hash[k]), hash[k]);
}
printf("Test : %s\n", hash[3]);
有人看到问题了吗?我希望使用这些散列与其他散列进行比较。您应该将
无符号字符tmp[2]
增加到无符号字符tmp[3]
并将无符号字符散列[8][32]
增加到无符号字符散列[8][33]代码>
一个问题是sprintf(tmp,“%2.2x”,hashResults[k][i])
,因为它写入两个字符+'\0',其中包含数组tmp
中的三个元素
但最大的问题是strcat(hash[k],tmp)代码>。
在哈希[k]数组中写入的每个内部for循环的末尾,有33个字符(32个字符+'\0')。当您在内部for循环中填充一个hash[k]
数组时,您也会将\0'
写入下一个数组的第一个元素,这就是printf(“%d\n%s\n”,strlen(hash[k]),hash[k])的原因代码>打印正确的结果。这会误导您相信您已经以null终止了散列[k]
数组。现在,当您输入下一个内部for循环时,您将覆盖上一次退出内部for循环时写入此数组的null,而不再终止上一个数组
因此,通过在内部for循环出口处的hash[k+1]
数组的第一个元素中写入零,可以将hash[k]
数组终止为null。然后,每次输入内部for循环时都会覆盖此空值
最后,数组中没有终止null,只有最后一个数组中的最终null
我想知道您每次都是如何让它工作的,因为您写入的终止null超出了数组大小,这会导致未定义的行为
制作tmp[3]
和hash[8][33]
可以解决您的问题
为了使strcat()函数正常工作,在要连接到的数组中必须至少有一个null,否则它将不知道连接到何处。您必须添加哈希[k][0]=0;在进入每个内部循环之前:
for (int k = 0; k < 8; ++k)
{
hash[k][0] = 0;
for (int i = 0; i < 16; ++i)
{
sprintf(tmp,"%2.2x",hashResults[k][i]);
strcat(hash[k],tmp);
}
printf("%d \n%s\n", strlen(hash[k]), hash[k]);
}
for(int k=0;k<8;++k)
{
散列[k][0]=0;
对于(int i=0;i<16;++i)
{
sprintf(tmp,“%2.2x”,hashResults[k][i]);
strcat(散列[k],tmp);
}
printf(“%d\n%s\n”),strlen(散列[k]),散列[k]);
}
您的答案没有解决问题,tmp[3]和散列[8][33]我的strlen(散列[i])在最后一次散列中分别取38、37、36、…、和32。和值不正确,:38-`By27b9a0940dc0645d477f19f6067b1c584 37-1C58414DA5C01667C9B18D40134C54113B5305336-53054A18E332AFBA75B9734E875323F452F835-2F8B96833277FAF31A5915C769F4434506您还有其他建议吗?:为了使strcat()
函数正常工作,在要连接到的数组中必须至少有一个null,否则它将不知道连接到何处。您必须添加hash[k][0]=0在进入每一个内部循环之前,你知道,如果你启动了调试器,你可以单步执行这段代码,准确地看到哪里出了问题。如果您不知道如何使用调试器,现在是学习调试器的最佳时机。虽然%2.2x
可以,但它通常被写成%02x
。
for (int k = 0; k < 8; ++k)
{
hash[k][0] = 0;
for (int i = 0; i < 16; ++i)
{
sprintf(tmp,"%2.2x",hashResults[k][i]);
strcat(hash[k],tmp);
}
printf("%d \n%s\n", strlen(hash[k]), hash[k]);
}