C++中的十六进制字符到int

nun*_*uck 3 c++ int hex char

如何将十六进制字符而不是字符串更改为数值?

在输入这个问题时,我发现了很多关于如何将十六进制字符串转换为值的答案.然而,没有人为chars工作.我记得在某处读到这适用于字符串:

std::string mystr = "12345";
unsigned int myval;
std::stringstream(mystr) >> std::hex >> myval;
Run Code Online (Sandbox Code Playgroud)

但是,如果我mystr[x]在循环中执行此代码将无法正常工作.我尝试添加一个新行std::string temp = mystr[x]并更改std::stringstream(mystr)std::stringstream(temp),但这也不起作用.

那我该怎么做呢?目前,我正在搜索一个十六进制字符串("0123456789abcdef".find(mystr[x]);)并使用索引作为值.但是,由于它搜索,它很慢,即使它只搜索16个字符.

http://ideone.com/dIyD4

lev*_*501 8

int intval = (hexchar >= 'A') ? (hexchar - 'A' + 10) : (hexchar - '0');
Run Code Online (Sandbox Code Playgroud)


Nic*_*ate 5

levis501 中的三元可以扩展为:

int v = (c >= 'A') ? (c >= 'a') ? (c - 'a' + 10) : (c - 'A' + 10) : (c - '0');
Run Code Online (Sandbox Code Playgroud)

但是如果你想要错误检查它会有点混乱:

int v = (c < '0')  ? -1 :
        (c <= '9') ? (c - '0') :
        (c < 'A')  ? v = -1 :
        (c <= 'F') ? (c - 'A' + 10) :
        (c < 'a')  ? v = -1 :
        (c <= 'f') ? (c - 'a' + 10) : -1;
Run Code Online (Sandbox Code Playgroud)

在 if-else 块中看起来也好不到哪里去:

int v = -1;
if ((c >= '0') && (c <= '9'))
    v = (c - '0');
else if ((c >= 'A') && (c <= 'F'))
    v = (c - 'A' + 10);
else if ((c >= 'a') && (c <= 'f'))
    v = (c - 'a' + 10);
Run Code Online (Sandbox Code Playgroud)

由于我想要一个快速的实现和验证,我去找了一个查找表:

int ASCIIHexToInt[] =
{
    // ASCII
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
    -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

    // 0x80-FF (Omit this if you don't need to check for non-ASCII)
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它只是:

int v = ASCIIHexToInt[c];
if (v < 0)
    // Invalid input
Run Code Online (Sandbox Code Playgroud)

可运行的示例是(希望)herehere


Bil*_*ill 3

您已经有了一个适用于字符串的解决方案。也将其用于chars:

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  char val = 'A';
  unsigned int myval;
  std::stringstream ss;
  ss << val;
  ss >> std::hex >> myval;
  cout << myval << endl;
}
Run Code Online (Sandbox Code Playgroud)

代码