Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不转换值的情况下保存uint8_t或char中字符串的十六进制值?_C++_String_Hex_Uint8t - Fatal编程技术网

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

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或其他值 如何做到这一点 感谢您的帮助:) 编辑: 正如我第一次预期的,并且已经确认的,无论我使用哪种方法,值都是相同的

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

因此,如果
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的形式存储。也许发布您正在使用的代码,以便我们确切地知道您在做什么?