мод беззнакового символа из безопасной хэш-функции

у меня есть unsigned char test_SHA1[20] из 20 байтов, который является возвращаемым значением из хеш-функции. Со следующим кодом я получаю этот вывод

unsigned char test_SHA1[20];
char hex_output[41];
for(int di = 0; di < 20; di++)
{
    sprintf(hex_output + di*2, "%02x", test_SHA1[di]);
}

printf("SHA1 = %s\n", hex_output);

50b9e78177f37e3c747f67abcc8af36a44f218f5

Последние 9 бит этого числа — 0x0f5 (= 245 в десятичном виде), которые я бы получил, взяв мод 512 из test_SHA1. Чтобы взять мод 512 из test_SHA1, я делаю

int x = (unsigned int)test_SHA1 % 512;
printf("x = %d\n", x);

Но x оказывается равным 158 вместо 245.


person Romonov    schedule 07.04.2011    source источник


Ответы (1)


Я предлагаю делать это побитово и с 0x1ff вместо использования оператора %.

person Ted Hopp    schedule 07.04.2011
comment
Спасибо. я пробовал test_SHA1 = test_SHA1 & 0x1ff; но это дает мне ошибку компиляции. не могли бы вы опубликовать команду, чтобы сделать побитовое И и преобразовать это в десятичное число. - person Romonov; 07.04.2011
comment
Я только что понял, что test_SHA1 - это массив (длиной 20, как я предполагаю из вашего цикла). Предполагая, что это массив символов, вы должны использовать (test_SHA1[18] & 1) + test_SHA1[19]. Или, если это более широкий целочисленный тип, test_SHA1[19] & 0x1ff. Это также объясняет более ранний результат — вы приводили указатель массива (адрес) к беззнаковому целому и брали младшие 9 битов адреса. - person Ted Hopp; 07.04.2011
comment
виноват. я должен был добавить объявление для test_SHA1. Я отредактировал сообщение, чтобы добавить его. - person Romonov; 07.04.2011
comment
@Ted Hopp с test_SHA1 беззнаковым символом размером 20 байт, не могли бы вы опубликовать, как изменить этот код int x = (unsigned int)test_SHA1 % 512; чтобы получить х = 245. - person Romonov; 07.04.2011
comment
Попробуйте int x = (test_SHA1[18] & 1) + (unsigned int)(test_SHA1[19]). - person Ted Hopp; 08.04.2011
comment
Спасибо большое! Это сработало. Просто наблюдение, просто удаление фигурных скобок вокруг test_SHA1[18] & 1 дает неверный результат. Это может быть связано с некоторым приоритетом оператора. - person Romonov; 08.04.2011