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

C 将无符号字符*转换为int的最佳方法?,c,string,C,String,您好,我有一个未签名字符*,它(在printf之后)看起来像这样(它是一个SHA-1散列): 我需要将这个无符号字符*转换成无符号整数,你认为最好的方法是什么?我有一些想法,但我不是C专家,所以在尝试我自己的东西之前,我想看看其他人的想法 这是160位,因此很难将其放入单个无符号整数中。但是,将其放入无符号整数数组中肯定是可能的 类似这样的东西(丑陋,对机器架构做了一些假设,可能应该在编译时使用CHAR_位和其他一些东西来获得正确的常量,但应该足以作为概念证明): 无符号整型(*转换)(无符号字

您好,我有一个
未签名字符*
,它(在printf之后)看起来像这样(它是一个SHA-1散列):


我需要将这个
无符号字符*
转换成
无符号整数
,你认为最好的方法是什么?我有一些想法,但我不是C专家,所以在尝试我自己的东西之前,我想看看其他人的想法

这是160位,因此很难将其放入单个无符号整数中。但是,将其放入无符号整数数组中肯定是可能的

类似这样的东西(丑陋,对机器架构做了一些假设,可能应该在编译时使用CHAR_位和其他一些东西来获得正确的常量,但应该足以作为概念证明):

无符号整型(*转换)(无符号字符*原始) { 无符号整数*rv=malloc(5*sizeof(无符号整数)); char*tp=原件;
对于(rvix=0;rvix嗯,这超过了4个字节,因此,如果您的系统使用32位的无符号整数,您就无法在不丢失信息的情况下完成此操作。照此,它必须是某种类型的散列。

为什么需要转换?这是一个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;
    }
}
(i=0;i<20;++i)的
{
printf(“%2x”,摘要[i]);
}
并与另一个类似的摘要进行比较

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;
    }
}
for(i=0,等于1;i<20;++i){
如果(a[i]!=b[i]){
等于等于0;
}
}

它就像一个20字节长的字节数组一样工作正常。你不必担心尾数、字长,什么都不用担心。

我认为你的代码被剪切了?你能重新粘贴吗?:-)是的,经典的“oops,<引入了标记”。问题是一个SHA-1字符串是160字节……我想我可以使用一个5个32位整数的数组来保存整个SHA-1字符串,并创建一个专用类来处理比较操作等。@Gando先生:实际上,一个20个字符的数组和一个5个整数的数组有什么区别?这不像你是我们将整数转换为整数,就像20字节的存储空间一样。在类中封装摘要是个好主意,但使用整数数组而不是字符是毫无意义的。@David:我同意。此外,字符(几乎)总是8位长(如果你真的需要超级便携,你可以随时检查字符位),而无符号整数可以在不同的机器上有不同的大小,以不同的字节顺序打包等。额外的复杂性几乎没有好处。@大卫:如果在您的特定实现中,您使用整数作为整数会怎么样?这不是
无符号字符*
,除非您的机器具有非常奇怪的体系结构。您可以很容易地让一个
无符号字符*
指向您的值。您到底想将其转换为什么,为什么?