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

How to save hex value from string in uint8_t or char without converting the value?

我有一个二进制文件,我正在读取它并将其保存为十六进制值。这些十六进制值将用于闪存设备,但我需要将十六进制值存储为 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;

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

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

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

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

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

的代码

不过这可能会有帮助:

std::string result;

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

result += 0x3A; // this

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

编译器假定 second 追加是一个十六进制数,因为它以 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

瞧!全部完成。