代码之家  ›  专栏  ›  技术社区  ›  Goles

将无符号char*转换为int的最佳方法?

  •  2
  • Goles  · 技术社区  · 16 年前

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

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

    我要把这个换成 无符号字符 unsigned int 你认为最好的方法是什么?我有一些想法,但我不是C专家,所以想在尝试我自己的东西之前先看看别人的想法。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Tadeusz A. Kadłubowski    16 年前

    为什么需要转换?消化道有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
  •  3
  •   T.E.D.    16 年前

    好吧,这超过了4个字节,所以如果您的系统使用32位作为无符号整型,那么在不丢失信息的情况下就不能这样做。噢,这一定是某种杂烩。

        3
  •  1
  •   Vatine    16 年前

    这是160位,所以很难放在一个无符号整数中。但是,它当然可以放在一个无符号整数数组中。

    类似这样的事情(丑陋,对机器架构做了一些假设,可能会使用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;
    }