C语言 在 32 位数组上复制 16 位哈希



我在使用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%sn", strlen(hash[k]), hash[k]);
}
printf("Test : %sn", 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

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

您应该将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]数组之一时,您还将'写入下一个数组中的第一个元素,这就是printf("%d n%sn", strlen(hash[k]), hash[k]);打印正确结果的原因。这会误导您认为您已 null 终止了hash[k]数组。现在,当您输入下一个内部 for 循环时,您将覆盖上次退出内部 for 循环时写入此数组的 null,不再终止前一个数组。

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

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

我想知道您如何每次都让它工作,因为您编写的终止 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%sn", strlen(hash[k]), hash[k]);
}

最新更新