C++中的十六进制字符到int
Hex character to int in C++
如何将十六进制字符而非字符串更改为数值?
在输入这个问题时,我发现了许多关于如何将十六进制字符串转换为值的答案。然而,没有一个适用于字符。我记得在某个地方读到这对字符串有效:
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
int intval = (hexchar >= 'A') ? (hexchar - 'A' + 10) : (hexchar - '0');
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;
如果其他块:,它看起来不会更好
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
可运行的示例(希望)就在这里。
您已经有了一个可以处理字符串的解决方案。也用于char
s:
#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;
}
代码
类似以下内容?
//! 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 );
}
相关文章:
- 按字符值访问int数组
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 将转换字符键入 int 以用作向量C++的索引
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 从 std::vector<无符号字符>切片中提取 int?
- QDial:如何将 int 值传递给需要常量字符*的 Qfile?
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 将子字符串字符从字符串值转换为 int,然后将其分配给 int 变量
- int 数组,但索引是字符?
- 如何将矢量<int>转换为字符数组?
- 仅读取文件末尾的最后 3 个字符,并将其另存为 int
- 递增 'int i = 0' 以在初始化的字符数组的位置递增
- 在 c++ 中逐个字符从字符串传递到 int 时不精确
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- PPM 将字符转换为 int 授予负数
- 第 5 行:字符 54:错误:调用"min(int,std::__cxx11::basic_string<char>::size_type)"没有匹配函数
- 将char类型指定给int以打印相应的ASCII字符
- 为什么采用 int 的函数重载优先于采用无符号字符的函数重载?
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- reinterpret_cast<int *>(字符 *)