如何在不转换值的情况下从uint8_t或char中的字符串保存十六进制值?

时间:2015-09-17 12:29:03

标签: c++ string hex uint8t

我有一个二进制文件,我正在阅读并保存为十六进制值。这些十六进制值将用于闪存设备,但我需要将十六进制值存储为uint8_t或char(最好是uint8_t)。目前,这些值存储在一个字符串中,一次只能存储一个字节。我想要做的是将值存储为uint8_t而不是字符串。

因此,如果std:string result的值为0x3A,我希望uint8_t flash[1]的值为0x3A,而不是58或其他值。

如何实现这一目标?

感谢任何帮助:)

编辑:

正如我第一次预料的那样,并且已经确认,无论我使用哪种方法,值都是相同的。 对于那些希望看到代码生成字符串的人,这里是:

unsigned char x;
std::ifstream input(file, std::ios::binary);
input >> std::noskipws;

std::stringstream stream, str;
stream << std::hex << std::setw(2) << std::setfill('0') << (int)x;
std::string result( stream.str() );

str << result;
int value;
str >> std::hex >> value;
uint8_t data = value;

3 个答案:

答案 0 :(得分:0)

0x3A58。它们在二进制中表示相同并且表示完全相同的东西 - 唯一的区别是输出到用户时的格式(默认情况下,整数在基数10中输出)。

如果您尝试在输出流中将58表示为0x3A,只需更改输出方式。

答案 1 :(得分:0)

值是值0x3A == 58。没有区别,如果你把它放在一个uint8_t是完全一样的。没有什么比将它存储为58或将其存储为0x3A。它最终都是:00111010

您可以使用strtol函数将十六进制数字转换为uint8_t,并使用16作为基数。

答案 2 :(得分:0)

为了完全理解您所说的内容,我们确实需要查看将数据放入std:string result的代码。

然而,这可能有所帮助:

std::string result;

result += 58; // this is the same as

result += 0x3A; // this

编译器假定第一个追加是十进制数,因为它不以0开头,并在将其附加到字符串之前将其从十进制转换为二进制。

编译器假定第二个追加是十六进制数,因为它以0x开头,并在将其附加到字符串之前将其从十六进制转换为二进制。

在这两种情况下,相同的二进制数都会附加到字符串中。

现在把它放到你的数组中我们可以做到:

uint8_t flash[2]; // big enough to our 2 chars

flash[0] = result[0]; // copy first value
flash[1] = result[1]; // copy second value
瞧!瞧!一切都完成了。