今天我尝试将十六进制字符串转换为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代码。因为我经常做错事^^。将不胜感激任何建议。
提前致谢
答案 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";