C++ 如何在不转换值的情况下保存uint8_t或char中字符串的十六进制值?
我有一个二进制文件,我正在读取并保存为十六进制值。这些十六进制值将用于闪存设备,但我需要将十六进制值存储为uint8_t或char(最好是uint8_t)。当前,值存储在字符串中,一次仅存储一个字节。我要做的是将值存储为uint8\u t而不是字符串 因此,如果C++ 如何在不转换值的情况下保存uint8_t或char中字符串的十六进制值?,c++,string,hex,uint8t,C++,String,Hex,Uint8t,我有一个二进制文件,我正在读取并保存为十六进制值。这些十六进制值将用于闪存设备,但我需要将十六进制值存储为uint8_t或char(最好是uint8_t)。当前,值存储在字符串中,一次仅存储一个字节。我要做的是将值存储为uint8\u t而不是字符串 因此,如果std:string result的值是0x3A,我希望uint8\u t flash[1]的值是0x3A,而不是58或其他值 如何做到这一点 感谢您的帮助:) 编辑: 正如我第一次预期的,并且已经确认的,无论我使用哪种方法,值都是相同的
std:string result
的值是0x3A
,我希望uint8\u 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;
无符号字符x;
std::ifstream输入(文件,std::ios::二进制);
输入>>标准::noskipws;
std::stringstream,str;
流0x3A
是58
。它们在二进制中表示相同,并且表示完全相同的内容-唯一的区别是输出到用户时的格式(默认情况下,整数以10为基数输出)
如果您试图在输出流中将58表示为0x3A
,只需更改输出它的方式。值就是值,0x3A==58
。没有区别,如果你把它放在一个uint8\u中,
是完全一样的。没有什么比将其存储为58或存储为0x3A更好的了。它的结尾都是:00111010
您可以使用strtol
函数将十六进制字符串转换为uint8\u t
,并使用16作为基数。为了完全理解您的意思,我们确实需要查看将数据放入std:string结果的代码
但是,这可能会有所帮助:
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
瞧!,都做完了 您知道0x3A
是58
?您不能读取或另存为十六进制值-十六进制是一种表示形式。所有东西都是以位的形式存储的,可以用二进制、十进制、十六进制等等来表示。是的,我完全知道这一点。但我需要以这种方式存储值,而不是58。如果你将一个字节读入内存,它总是以二进制格式存储。如何表示二进制值(十进制、十六进制、八进制、二进制)是不相关的,数据仍然以二进制1和0的形式存储。也许发布您正在使用的代码,以便我们确切地知道您在做什么?