Лучший способ конвертировать unsigned char * в int? - PullRequest
2 голосов
/ 20 января 2010

Здравствуйте, у меня есть unsigned char *, который выглядит (после printf) так (это хэш SHA-1):

n\374\363\327=\3103\231\361P'o]Db\251\360\316\203

Мне нужно преобразовать unsigned char * в unsigned int. Как вы думаете, что будет лучшим способом сделать это? У меня есть некоторые идеи, но я не эксперт по Си, поэтому хотел бы увидеть чужие идеи, прежде чем попробовать свои собственные.

Ответы [ 3 ]

3 голосов
/ 20 января 2010

Ну, это больше, чем 4 байта, поэтому, если ваша система использует 32-битное значение для неподписанного типа int, вы не сможете сделать это без потери информации. IOW, это должен быть какой-то хеш.

3 голосов
/ 20 января 2010

Зачем вам нужно преобразование? Это 160-битный дайджест. Дайджесты используются только двумя способами:

Вы печатаете дайджест с чем-то вроде

for (i = 0; i < 20; ++i) {
    printf("%2x", digest[i]);
}

и сравнить с другим дайджестом с чем-то вроде

for (i = 0, equals = 1; i < 20; ++i) {
    if (a[i] != b[i]) {
        equals = 0;
    }
}

Он работает просто отлично, как 20-байтовый массив байтов. Вам не нужно беспокоиться о порядке байтов, длине слова, ничего.

1 голос
/ 20 января 2010

Это 160 бит, так что было бы трудно уместить в один беззнаковый int. Однако, безусловно, можно было бы поместить его в массив беззнаковых целых.

Примерно так (некрасиво, делает пару предположений об архитектуре машины, вероятно, следует использовать CHAR_BITS и пару других вещей во время компиляции, чтобы иметь правильные константы, но должно быть достаточно в качестве подтверждения концепции):

unsigned int (*convert)(unsigned char *original)
{
  unsigned int *rv = malloc(5*sizeof(unsigned int));
  char *tp = original;

  for (rvix=0;rvix<5;rvix++) {
    rv[rvix] = *(tp++)<<24;
    rv[rvix] |= *(tp++)<<16;
    rv[rvix] |= *(tp++)<<8;
    rv[rvix] |= *(tp++);
  }

  return rv;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...