为什么这些重新转换字符串类型返回不同的数据?



我正在从我无法控制的文本文件中读取'qbytearray'字符串。我没有使用Qt

但是这种在文本文件中处理字符串的方式在我的程序中是有效的:

unsigned char* apa = (unsigned char*)"xf1`xf9a\x9cTx82zx17x5xb9xbcx60xcax15";

,但这不起作用:

unsigned char* apa = (unsigned char*)settings_in.at(1).c_str();

(是的,我已经仔细检查了std::string settings_in的内容)

为什么这些不同?我怎样才能用std::string获得最上面的结果呢?

更新:好的,根据你的评论更多信息:我正在阅读Qt生成的文本文件与行,

1rp_key=@ByteArray(xf1`xf8a\x9cTx82zx14x5xb9xbcx80xcax15)

我剥离了括号内的长字符串。我也不想重选,但我试过很多没用的方法,似乎都能让我有所收获。

目标是填充这个变量
uint8_t rp_key[0x10] = {0};

硬编码的"基本事实":

unsigned char* apa = (unsigned char*)"xf1`xf8a\x9cTx82zx14x5xb9xbcx80xcax15";
printf("No1:  %sn", apa);

和std::string代码,打印出与上面相同的字符串,但采用ASCII (unicode?)格式:

std::string str = settings_in.at(1);
unsigned char* thing = (unsigned char*)str.c_str();
printf("No2:  %sn", thing);

嗯,我不确定我能写什么来证明我的'settings_in'的内容。我刚刚试了一下:

char *cstr = "xf1`xf8a\x9cTx82zx18x5xb9xbcx80xcax15";
std::string str = cstr;
unsigned char* thing = (unsigned char*)str.c_str();
printf("No2:  %sn", thing);

,但这是不好的,因为结果在我的程序中工作。这是证据吗?(由于原始内容敏感,我正在修改,请忽略实际内容)

这也适用于程序

std::string str = "xf1`xf8a\x7cTx82zx14x5xb9xbcx80xcax15";
unsigned char* thing = (unsigned char*)str.c_str();
printf("No2:  %sn", thing);

我要把这个放在这里作为另一个溢出问题的答案:

翻译是在编译时完成的,这样每个字符串都可以使用x手动输入源代码,最终得到它在二进制中表示的字符。如果你想在在运行时,您将需要调用类似strtol()的解析函数Base 16传递包含十六进制的字符串并将其强制转换为char。

如何"x"在字符串中工作?

这完全符合正在发生的事情。

关于如何在运行时模拟的建议似乎并不适用于我的情况。