在32位阵列上复制16位散列

时间:2018-05-11 18:52:04

标签: c hash printf strcat

我使用sprintfstrcat时遇到问题。这是我的代码:

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

函数transformation()在16位上给出了8个哈希值。

我使用sprintfstrcat来获取32位的哈希值。当我尝试读取所有hash[k]时,strlen(hash[8])返回给我32(这是正确的),字符串也是正确的。 但是,当我尝试在循环外部读取hash[3]时,它包含所有值。

例如,我程序的输出:

32 - 4a18e332afba75b9734e875323f452f8

32 - b96833277faf31a5915c769f44634506

32 - f89f6dd8cd5aee79de3b2c0c27cafe2e

32 - c9f629472c862c1e7542f4cb2835d02b

32 - 09fc12cfb0a81a38513dbd5edff19e52

32 - 35564354793555a3ae1382f647044445

Test : b96833277faf31a5915c769f44634506f89f6dd8cd5aee79de3b2c0c27cafe2ec9f629472c862c1e7542f4cb2835d02b09fc12cfb0a81a38513dbd5edff19e5235564354793555a3ae1382f647044445

有没有人看到这个问题?我希望使用这些哈希来将它们与其他哈希值进行比较。

1 个答案:

答案 0 :(得分:1)

您应该将unsigned char tmp[2]增加到unsigned char tmp[3],将unsigned char hash[8][32]增加到unsigned char hash[8][33];

一个问题是sprintf(tmp,"%2.2x",hashResults[k][i]),因为它写了两个字符+'\ 0',它在数组tmp中包含三个元素。

但最大的问题是strcat(hash[k],tmp);。 在每个内部for循环结束时,你已经在hash [k]数组中写入了33个字符(32个字符+'\ 0')。当您在内部for循环中填充其中一个hash[k]数组时,您还会将\0'写入下一个数组中的第一个元素,这就是printf("%d \n%s\n", strlen(hash[k]), hash[k]);打印正确结果的原因。这误导你相信你已经终止了hash[k]数组。现在,当您进入下一个内部for循环时,您将覆盖上次退出内部for循环时已写入此数组的null,不再终止前一个数组。

因此,通过将零写入内部for循环退出处的hash[k]数组的第一个元素,null终止hash[k+1]数组。然后每次进入内部for循环时都覆盖此空值。

最后,你的数组中没有终止空值,只有最后一个数组的最后一个空值。

我想知道你是怎么每次都让它工作的,因为你写的超出数组大小的终止空值会导致未定义的行为。

制作tmp[3]hash[8][33]可以解决您的问题。

为了使strcat()函数正常工作,你必须在要连接的数组中至少有一个null,否则它将不知道连接到哪里。你必须添加hash [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]);
}