我试图快速解码ISO8583消息位图。假设第一个位图char是' B',我想将其转换为十六进制值0xB(十进制11),然后检查标记的位。最后一部分我这样做:
for(int i = 0; i < 4; i++){
std::cout << (value &(1 << i));
}
由于位图和消息很长,我试图快速解码。我看到了一些使用std :: hex和std :: stringstream的SO帖子。但是使用这个或查找表是不是太多了?
答案 0 :(得分:2)
我想要的是从'B'转换为十六进制值0xB,即11
因此,您希望将B解释为十六进制数字并获取数值,而不是“将其转换为十六进制表示”。以下适用于任何基数(最多36个基数)以及大写和小写数字:
int value =
(c >= '0' && c <= '9') ? (c - '0') :
(c >= 'A' && c <= 'Z') ? (c - 'A' + 0xA) :
(c >= 'a' && c <= 'z') ? (c - 'a' + 0xA) :
-1; // error
如果您想要输入不是十六进制数字时的错误值,则可以将z
替换为f
。
旧答案:
字符编码为数字。什么数值表示由字符编码确定的字符。
数字的“十六进制表示”是一串字符。这些字符分别代表数字的十六进制数字。如果没有字符编码的上下文,十六进制表示中字符的数值是没有意义的。假设第一个位图char是'B',我想将其转换为十六进制表示(将'B'转换为0xB)
#include <string>
using namespace std::string_literals;
int main() {
char c = 'B';
std::string hex = "0x"s + c; // now hex is "0xB"
}
首先将B
转换为整数,然后使用std::stringstream
返回到十六进制表示,如果你想要的只是添加前缀,那确实效率很低。
答案 1 :(得分:1)
创建一个充当地图的数组。
int hexNumbers[] = { 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
然后使用它如下:
if ( c >= 'A' && c <= 'F' )
{
number = hexNumbers[c-'A'];
}
else if ( c >= 'a' && c <= 'f' )
{
number = hexNumbers[c-'a'];
}
你也可以在没有地图的情况下这样做:
if ( c >= 'A' && c <= 'F' )
{
number = 0xA + (c-'A');
}
else if ( c >= 'a' && c <= 'f' )
{
number = 0xA + (c-'a');
}