Скопировать 16-битный хэш на 32-битный массив - PullRequest
0 голосов
/ 11 мая 2018

У меня проблема с использованием 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]);

Функция transformation() дает мне 8 хешей на 16 бит.

Я использую sprintf и strcat, чтобы получить хеш на 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 голосов
/ 11 мая 2018

Вы должны увеличить 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 вы записали в хэш-массивы [k] 33 символа (32 символа + '\ 0'). Когда вы заполняете один из hash[k] массивов во внутреннем цикле for, вы также записываете \0' в первый элемент следующего массива, поэтому printf("%d \n%s\n", strlen(hash[k]), hash[k]); выводит правильные результаты. Это вводит вас в заблуждение, полагая, что вы обнулили массивы hash[k]. Теперь, когда вы вводите следующий внутренний цикл for, вы перезаписываете ноль, записанный в этот массив при предыдущем выходе из внутреннего цикла for, больше не завершая предыдущий массив.

Таким образом, вы завершаете нулевой массив hash[k], записывая ноль в первый элемент массива hash[k+1] на выходе внутреннего цикла for. Затем вы переопределяете это нулевое значение каждый раз, когда вводите внутренний цикл for.

В конце концов, у вас нет завершающих нулей в ваших массивах, и есть только последний нулевой в последнем массиве.

Интересно, как вы заставляете это работать каждый раз, потому что вы записываете завершающий ноль за пределами размера массива, что приводит к неопределенному поведению.

Создание tmp[3] и hash[8][33] должно решить вашу проблему.

Для правильной работы функции strcat () необходимо иметь по крайней мере один нуль в массиве, к которому вы присоединяете, потому что в противном случае он не знал бы, куда объединить. Вы должны добавить хеш [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]);
}
...