C ++ char十六进制值到字节

时间:2011-08-17 09:32:46

标签: c++ hex

我在char指针中有一个十六进制值(例如'F3'),我想将它转换为byte,因为我希望它放入一个数组。我知道有很多解决方案,但它们不是我想要的。

提前致谢!

编辑:

好吧,也许我没有写过一切。 我现在拥有的:

char aChar[5];
itoa (j, aChar, 16);

j现在是3,我只想要它在字节中。 Atoi,scanf没有帮助,这些是不同的解决方案。

4 个答案:

答案 0 :(得分:6)

由于你已经标记了这个C ++而不是C,我不打算使用任何C函数(assert()除外)来演示行为,边缘条件,等等)。这是一个示例文件。我们称之为hex2byte.cpp:

#include <sstream>
#include <cassert>

unsigned char hex2byte(const char* hex)
{
    unsigned short byte = 0;
    std::istringstream iss(hex);
    iss >> std::hex >> byte;
    return byte % 0x100;
}

int main()
{
    const char* hex = "F3";
    assert(hex2byte(hex) == 243);
    assert(hex2byte("") == 0);
    assert(hex2byte("00") == 0);
    assert(hex2byte("A") == 10);
    assert(hex2byte("0A") == 10);
    assert(hex2byte("FF") == 255);
    assert(hex2byte("EEFF") == 255);
    assert(hex2byte("GG") == 00);
    assert(hex2byte("a") == 10);
    assert(hex2byte("0a") == 10);
    assert(hex2byte("f3") == 243);
    assert(hex2byte("ff") == 255);
    assert(hex2byte("eeff") == 255);
    assert(hex2byte("gg") == 00);
}

成功:

% make hex2byte
g++ -Wall -Wextra -Wshadow -pedantic -Weffc++ -Werror hex2byte.cpp -o hex2byte

运行它:

% ./hex2byte

没有断言。添加错误处理(例如检查何时hex == NULL等等)。

答案 1 :(得分:3)

一个字节通常只是一个无符号字符

myArray[n] = (unsigned char)*p;

或者你的意思是你有一个十六进制值的字符串表示?

答案 2 :(得分:1)

给定char * "F3"

char *hexstr = "F3";

然后你可以这样做:

unsigned char byteval =
    (((hexstr[0] >= 'A' && hexstr[0] <= 'Z') ? (10 + hexstr[0] - 'A') : 
    (hexstr[0] >= 'a' && hexstr[0] <= 'z') ? (10 + hexstr[0] - 'a') : 
    (hexstr[0] >= '0' && hexstr[0] <= '9') ? (hexstr[0] - '0') : 0) << 4) |
    ((hexstr[1] >= 'A' && hexstr[1] <= 'Z') ? (10 + hexstr[1] - 'A') : 
    (hexstr[1] >= 'a' && hexstr[1] <= 'z') ? (10 + hexstr[1] - 'a') : 
    (hexstr[1] >= '0' && hexstr[1] <= '9') ? (hexstr[1] - '0') : 0);

我很遗憾它的丑陋;我相信它可以改进。

您可以将其转换为函数:

inline unsigned char hextobyte(const char *s) {
    return
    (((s[0] >= 'A' && s[0] <= 'Z') ? (10 + s[0] - 'A') : 
    (s[0] >= 'a' && s[0] <= 'z') ? (10 + s[0] - 'a') : 
    (s[0] >= '0' && s[0] <= '9') ? (s[0] - '0') : 0) << 4) |
    ((s[1] >= 'A' && s[1] <= 'Z') ? (10 + s[1] - 'A') : 
    (s[1] >= 'a' && s[1] <= 'z') ? (10 + s[1] - 'a') : 
    (s[1] >= '0' && s[1] <= '9') ? (s[1] - '0') : 0);
}

答案 3 :(得分:1)

我至少可以想到五种方式:

  1. sscanf%x
  2. 一起使用
  3. 使用strtol使用正确的基础
  4. 使用istringstream(尽管你必须从无符号短文转换为无符号字符)
  5. 升压::精神
  6. 手动循环以逐个字符地解析
  7. 您列出的方式都不起作用。但你的问题仍然不是很清楚,你有一个字符,不知何故你使用itoa转换为十六进制,现在你想转换为一个字节!?!演员出了什么问题?例如unsigned char byte = static_cast<unsigned char>(charvalue);