如何将十六进制字符串转换为十进制数?

3

如何从十六进制字符串中获取十进制数:
我有一个unsigned char* hexBuffer = "eb89f0a36e463d"; 还有一个unsigned char* hex[5] ={'\\','x'};
我将hexBuffer的前两个字符"eb"复制到hex[2] = 'e'; hex[3] = 'b';.
现在在hex中有字符串"\xeb""\xEB".
我们都知道0xEB是十六进制,可以转换为235十进制。

如何将"\xEB"转换为235(int)?

(感谢jedwards)
我的答案(也许对某些人有用):

/*only for lower case & digits*/ 
unsigned char hash[57] ="e1b026972ba2c787780a243e0a80ec8299e14d9d92b3ce24358b1f04";  
unsigned char chr =0;  
int dec[28] ={0}; int i = 0;int c =0;  
while( *hash )  
{  
c++;  
(*hash >= 0x30 && *hash <= 0x39) ? ( chr = *hash - 0x30) : ( chr = *hash - 0x61 + 10);  
*hash++;  
if ( c == 1) dec[i] = chr * 16; else{ dec[i] += chr; c = 0; dec[i++];}  
}
3个回答

8

1
你为什么需要没有sscanf的这个?你没有访问cstd库吗? - OmnipotentEntity
这并不是个真正的原因。你是想通过重新实现标准库来学习 C 吗?你尝试达到什么目的呢? - OmnipotentEntity
@MakeKaker,嗯,你可以始终采用E * 16^1 + B * 16^0。请注意,没有幂运算符。 - chris
我在谈论的是 0xE 而不是 'E',Chris 也是这样。 - OmnipotentEntity
你等了几天之后回复了我,然后又删除了回复,再次回复以便让我看到?我没有回复是有原因的。原因是我们在互相误解,没有必要再回复了,因为你不会听我的话,所以这样做并不值得。删除你的评论,然后重新添加它是非常讨厌的行为,我希望你将来不要这样做。 - OmnipotentEntity

5
在C++11中,您可以使用其中之一字符串转换为无符号整数类型整数转换函数
long i = std::stol("ff", nullptr, 16); // convert base 16 string. Accepts 0x prefix.

当然,这需要您的字符串表示一个可以适应表达式左侧整数类型的数字。

4

通常我看到的十六进制转十进制函数的自制实现如下:

#include <stdio.h>

unsigned char hex2dec_nibble(unsigned char n)
{
    // Numbers
    if(n >= 0x30 && n <= 0x39)
    {
        return (n-0x30);
    }
    // Upper case
    else if(n >= 0x41 && n <= 0x46)
    {
        return (n-0x41+10);
    }
    // Lower case
    else if(n >= 0x61 && n <= 0x66)
    {
        return (n-0x61+10);
    }
    else
    {
        return -1;
    }    
}


int main()
{   
    unsigned char t;
    t = '0';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = 'A';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = 'F';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = 'G';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = 'a';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = 'f';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = 'g';  printf("%c = %d\n", t, hex2dec_nibble(t));
    t = '=';  printf("%c = %d\n", t, hex2dec_nibble(t));
}

这将显示:

0 = 0
A = 10
F = 15
G = 255
a = 10
f = 15
g = 255
= = 255

我将把从nibble到byte,再从byte转换为任意长度字符串的练习留给你。

注意: 我只使用了#includeprintf来演示hex2dec_nibble函数的功能。使用这些内容并非必须。


我认为你没有理解我的回答,至少在你的评论中没有反映出来。我没有说过任何关于你编写的代码的话。 - jedwards
1
我明白,我在这个答案中发布的代码将使您达到E=14和B=11。要从14和11到235,您遵循任何基数相同的规则。在这种情况下,它将是(14 * 16)+ 11。您将上半字节乘以16并加上下半字节。 - jedwards

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接