变换' B'进入0xB

时间:2016-06-02 14:33:25

标签: c++ char hex

我试图快速解码ISO8583消息位图。假设第一个位图char是' B',我想将其转换为十六进制值0xB(十进制11),然后检查标记的位。最后一部分我这样做:

for(int i = 0; i < 4; i++){
    std::cout << (value &(1 << i));
}

由于位图和消息很长,我试图快速解码。我看到了一些使用std :: hex和std :: stringstream的SO帖子。但是使用这个或查找表是不是太多了?

2 个答案:

答案 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');
}