在我下面的CODE 1
代码中,从文件中阅读十六进制并存储在字符串数组中,在打印出来时不会将其转换为ASCII
。
#include <iostream>
#include <sstream>
#include <fstream>
int main(int argc, char** argv)
{
// CODE 1
std::ifstream input("C:\\test.txt"); // The test.txt contains \x48\x83\xEC\x28\x48\x83
std::stringstream sstr;
input >> sstr.rdbuf();
std::string test = sstr.str();
std::cout << "\nString from file: " << test;
//char* lol = new char[test.size()];
//memcpy(lol, test.data(), test.size());
////////////////////////////////////////////////////////
// CODE 2
std::string test_2 = "\x48\x83\xEC\x28\x48\x83";
std::cout << "\n\nHardcoded string: " << test_2 << "\n";
// Prints as ASCII "H(H" , which I want my CODE 1 to do.
}
在我的CODE 2
示例中,使用了相同的HEX
,并将其打印为ASCII
。为什么CODE 1
不相同?
3条答案
按热度按时间3zwtqj6y1#
好的,看起来有些混乱。首先,我必须问你是否确定你知道你的档案里有什么。
就是有没有包含哦,看起来大概二十个字左右:
等等
或者它包含一个十六进制48(一个字节),一个十六进制83(一个字节),总共5个字符?
我敢打赌这是第一个,我敢打赌你的文件大约有20个字符长,并且包含了要打印的字符串。
如果是的话,那么代码正在做你所期望的事情,它阅读一行文本,然后把它写回来,如果你想让它像编译器一样解释它,那么你必须自己完成这些步骤。
现在,如果它实际上包含十六进制字符(但我打赌它不包含),那么这是一个有点不同的问题,我们将不得不考虑这个问题,但我认为你只是有一个字符串,其中包括
\x
,阅读/写不会自动为你做一些魔术。gijlo24d2#
当你从文件中读取时,反斜杠字符不会被转义。你从文件中读取的
test
字符串实际上是一个字符数组:{'\\', 'x', '4', '8', ... }
而您的硬编码文本字符串
"\x48\x83\xEC\x28\x48\x83";
则完全由编译器进行十六进制转义。如果你真的想把你的数据以一系列“反斜杠x NN”序列的形式存储在一个文本文件中,你需要在你读取文件之后进行转换,这里有一个破解的循环可以帮你完成。
67up9zun3#
可以将返回的字符串拆分为
\x
,然后从string强制转换为int,最后强制转换为char。此资源将很有帮助
strtok和convert