Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在32位数组上复制16位哈希_C_Hash_Printf_Strcat - Fatal编程技术网

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