在 C++ 中将十六进制字符转换为 int

Posted

技术标签:

【中文标题】在 C++ 中将十六进制字符转换为 int【英文标题】:Hex character to int in C++ 【发布时间】:2011-09-21 09:38:38 【问题描述】:

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

在输入这个问题时,我找到了很多关于如何将十六进制字符串转换为值的答案。但是,没有一个适用于字符。我记得在某处读到这适用于字符串:

std::string mystr = "12345";
unsigned int myval;
std::stringstream(mystr) >> std::hex >> myval;

但是,如果我在循环中执行mystr[x],则此代码将不起作用。我尝试使用std::string temp = mystr[x] 添加新行并将std::stringstream(mystr) 更改为std::stringstream(temp),但这也不起作用。

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

http://ideone.com/dIyD4

【问题讨论】:

很难理解你的尝试。为什么不发布您尝试过的所有变体并解释它们为什么不起作用。 C++ convert hex string to signed integer的可能重复 【参考方案1】:

来自 levis501 的三元可以扩展为:

int v = (c >= 'A') ? (c >= 'a') ? (c - 'a' + 10) : (c - 'A' + 10) : (c - '0');

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

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;

在 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);

因为我想要一个快速的实现和验证,所以我找了一个查找表:

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,
;

在这种情况下,它只是:

int v = ASCIIHexToInt[c];
if (v < 0)
    // Invalid input

可运行的示例是(希望)here 和 here。

【讨论】:

【参考方案2】:

您已经有了一个适用于字符串的解决方案。也将它用于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;

Code

【讨论】:

【参考方案3】:

类似于以下内容?

//!         \return
//!             The numeric value of ch, if it is hex, otherwise -1
int
fromHexChar( char ch )

    static char const hexChars[] = "0123456789ABCDEF";
    char const* p = std::find( begin( hexChars ), end( hexChars ),
                               ::tolower( (unsigned char)ch ) );
    return p == end( hexChars )
        ? -1
        : p - begin( hexChars );

【讨论】:

【参考方案4】:
int intval = (hexchar >= 'A') ? (hexchar - 'A' + 10) : (hexchar - '0');

【讨论】:

您的代码版本是否适用于不同情况的十六进制字符? (例如'a','A') 在使用该表达式之前,只需将 hexchar 转换为大写字母。 @quamrana:我在答案中添加了小写支持。

以上是关于在 C++ 中将十六进制字符转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将十六进制字符串转换为字节数组

如何在 C++ 中将字节数组转换为十六进制字符串?

如何在 Swift 中将 Int 转换为十六进制字符串

如何在 Visual C++ 中将字节数组转换为十六进制字符串?

如何在 C++ 中将十六进制数字转换为二进制?

如何在 C++ 中将字符串从十进制代码转换为西里尔文/unicode16?