如何在不转换值的情况下从 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;
0x3A
是 58
。它们在二进制中表示相同,意思完全相同 - 唯一的区别是输出给用户时的格式(整数,默认情况下,以 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
瞧!全部完成。
我有一个二进制文件,我正在读取它并将其保存为十六进制值。这些十六进制值将用于闪存设备,但我需要将十六进制值存储为 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;
0x3A
是 58
。它们在二进制中表示相同,意思完全相同 - 唯一的区别是输出给用户时的格式(整数,默认情况下,以 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
瞧!全部完成。