我试图输出此.exe文件的纯文本内容。它有明文内容,如#34;以这种方式更改代码不会影响最终优化代码的质量。"所有的东西微软放入.exe文件。当我运行以下代码时,我得到M Z E
的输出,后跟一颗心和一颗钻石。我做错了什么?
ifstream file;
char inputCharacter;
file.open("test.exe", ios::binary);
while ((inputCharacter = file.get()) != EOF)
{
cout << inputCharacter << "\n";
}
file.close();
答案 0 :(得分:4)
我会使用std::isprint之类的东西来确保字符是可打印的,而不是在打印之前的某些奇怪的控制代码。
这样的事情:
#include <cctype>
#include <fstream>
#include <iostream>
int main()
{
std::ifstream file("test.exe", std::ios::binary);
char c;
while(file.get(c)) // don't loop on EOF
{
if(std::isprint(c)) // check if is printable
std::cout << c;
}
}
答案 1 :(得分:3)
您已打开二进制流,这有助于达到预期目的。但是,您按原样打印每个二进制数据:某些字符不可打印,给出奇怪的输出。
潜在解决方案:
如果要打印exe的内容,您将获得比可打印的字符更多的不可打印字符。因此,一种方法可能是打印十六进制值:
while ( file.get(inputCharacter ) )
{
cout << setw(2) << setfill('0') << hex << (int)(inputCharacter&0xff) << "\n";
}
或者您可以使用显示十六进制值的调试器方法,然后显示char,如果它可打印或&#39;。&#39;如果没有:
while (file.get(inputCharacter)) {
cout << setw(2) << setfill('0') << hex << (int)(inputCharacter&0xff)<<" ";
if (isprint(inputCharacter & 0xff))
cout << inputCharacter << "\n";
else cout << ".\n";
}
嗯,为了符合人体工程学,如果exe文件包含任何真正的exe,你最好选择在每一行显示几个字符; - )
答案 2 :(得分:2)
二进制文件是字节的集合。字节的值范围为0..255。可以安全打印的可打印字符&#34;形成一个更窄的范围。假设大多数基本的ASCII编码
请参阅ascii table。
超出该范围的每个角色至少可以:
一些终端支持&#34;文本结束&#34;字符,然后将停止打印任何文本。也许你打了那个。
我要说,如果您只对文字感兴趣,那么只打印那些原则并忽略其他原语。或者,如果你想要一切,那么可能用十六进制形式写出来吗?
答案 3 :(得分:0)
这有效:
ifstream file;
char inputCharacter;
string Result;
file.open("test.exe", ios::binary);
while (file.get(inputCharacter))
{
if ((inputCharacter > 31) && (inputCharacter < 127))
Result += inputCharacter;
}
cout << Result << endl;
cout << "These are the ascii characters in the exe file" << endl;
file.close();