十六进制字符串到unsigned char []

时间:2011-05-15 00:21:09

标签: c++ type-conversion

今天我尝试将十六进制字符串转换为unsigned char []

string test = "fe5f0c";
unsigned char* uchar= (unsigned char *)test.c_str();
cout << uchar << endl;

这导致了

的输出
fe5f0c

hrmpf :-(。期望的行为如下:

unsigned char caTest[2]; 
caTest[0] = (unsigned char)0xfe;
caTest[1] = (unsigned char)0x5f;
caTest[2] = (unsigned char)0x0c;
cout << caTest << endl;

打印不可读的ascii代码。因为我经常做错事^^。将不胜感激任何建议。

提前致谢

3 个答案:

答案 0 :(得分:2)

当然,您只需要在解析后隔离您感兴趣的位:

#include <string>
#include <cstdlib>
#include <iostream>

typedef unsigned char byte;

int main()
{
    std::string test = "40414243";
    unsigned long x = strtoul(test.c_str(), 0, 16);
    byte a[] = {byte(x >> 24), byte(x >> 16), byte(x >> 8), byte(x), 0};
    std::cout << a << std::endl;
}

请注意,我将输入字符串更改为八位数字,否则数组将以值0开头,而operator<<会将其解释为结束,您将无法看到任何内容。

答案 1 :(得分:1)

"fe5f0c"是一个6字节的字符串(7包含空终止符)。如果您将其视为数组,您会看到:

char str[] = { 102, 101, 53, 102, 48, 99 };

但你想要

unsigned char str[] = { 0xfe, 0x5f, 0x0c };

前者是“人类可读”的表示,而后者是“机器可读”的数字。如果你想在它们之间进行转换,你需要使用类似于@Fred所写的代码来明确地进行转换。

强制转换(大部分时间)并不意味着转换,您只需告诉编译器信任您,并且它可以忘记它认为它对您正在投射的表达式的了解。

答案 2 :(得分:0)

以下是十六进制字符串文字的简单方法:

unsigned char *uchar = "\xfe\x5f\x0c";