你好我有unsigned char *
看起来(在printf之后)像这样(它是一个SHA-1哈希):
n\374\363\327=\3103\231\361P'o]Db\251\360\316\203
我需要将此unsigned char *
转换为unsigned int
,您认为最好的方法是什么?我有一些想法,但我不是C专家,所以在尝试我自己的东西之前想要看到别人的想法。
答案 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; }