将unsigned char *转换为int的最佳方法?

时间:2010-01-20 13:28:48

标签: c string

你好我有unsigned char *看起来(在printf之后)像这样(它是一个SHA-1哈希):

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

我需要将此unsigned char *转换为unsigned int,您认为最好的方法是什么?我有一些想法,但我不是C专家,所以在尝试我自己的东西之前想要看到别人的想法。

3 个答案:

答案 0 :(得分:3)

那么,这超过4个字节,所以如果你的系统使用32位作为unsigned int,你就不能在没有丢失信息的情况下这样做。 IOW,它必须是某种哈希。

答案 1 :(得分:3)

为什么需要转换?这是一个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字节长的字节数组一样。你不必担心字节序,字长,没什么。

答案 2 :(得分:1)

那是160位,所以难以适应单个unsigned 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;
}