0

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

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

如何做到这一点?

任何帮助表示赞赏:)

编辑:

正如我最初预期并已确认的那样,无论我使用哪种方法,这些值都是相同的。对于那些希望查看生成字符串的代码的人,这里是:

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;
4

3 回答 3

0

一个值就是一个值,0x3A == 58。没有区别,就是如果你把它放在一个uint8_tis中是完全一样的。没有什么比将其存储为 58 或将其存储为 0x3A 更好的了。它都以:00111010.

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

于 2015-09-17T12:34:51.253 回答
0

为了完全理解您在说什么,我们确实需要查看将数据放入您的std:string result.

但是,这可能会有所帮助:

std::string result;

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

result += 0x3A; // this

编译器假定第一个附加是十进制数,因为它不以 a 开头,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

瞧!,一切都完成了。

于 2015-09-17T12:51:12.623 回答
0

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

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

于 2015-09-17T12:34:44.987 回答