如何从字符串十六进制中获取小数:
我有unsigned char* hexBuffer = "eb89f0a36e463d";.
我有unsigned char* hex[5] ={'\\','x'};.
我从hexBuffer
前两个字符"eb"
复制到hex[2] = 'e'; hex[3] = 'b';
现在我在十六进制内有字符"\xeb"
或"\xEB"
我们都知道0xEB
它的ahexdecimal,我们可以转换为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++];}
}
答案 0 :(得分:8)
您想要的功能称为sscanf.
http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
int integer;
sscanf(hexBuffer, "%x", &integer);
答案 1 :(得分:5)
在C ++ 11中,您可以使用string to unsigned integral type和integral conversion functions之一:
long i = std::stol("ff", nullptr, 16); // convert base 16 string. Accepts 0x prefix.
当然,这要求您的字符串表示一个数字,该数字可以适合表达式LHS的整数类型。
答案 2 :(得分:4)
通常我看到自制的hex2dec函数实现如下:
#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
我会把它作为练习让你从半字节转到字节然后从字节到任意长度的字符串。
注意:我仅使用#include
和printf
来演示hex2dec_nibble
功能的功能。没有必要使用这些。