我有一个二进制文件,我正在阅读并保存为十六进制值。这些十六进制值将用于闪存设备,但我需要将十六进制值存储为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;
答案 0 :(得分:0)
0x3A
是58
。它们在二进制中表示相同并且表示完全相同的东西 - 唯一的区别是输出到用户时的格式(默认情况下,整数在基数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
瞧!瞧!一切都完成了。