2

这是我的第一篇文章,如果我违反任何不成文的规则,非常抱歉。:PI 是一个初学者/中级程序员,我需要这个程序的帮助。

我正在尝试将 .dat 文件作为 HEX 输入/读取/ifstream(无论如何)到一个大字符串中。

我不想把它当作文本来阅读。我想要十六进制格式,这样我就可以搜索字符串并对其进行更改。(就像一个自动十六进制编辑器)

前任。我的文件“00000000.dat”的大小约为 7kb。

在十六进制编辑器中,十六进制如下所示:

0A 00 00 0A 00 05 4C 65 76 65 6C 07 00 06 42 6C 6F 63 6B 73 00 00 80 00 07 FF 39
01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02
FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF
39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03
02 FF 3F 00..... for a while...

我需要将所有这些都放在一个字符串变量中(最好没有空格)。

我当前的代码很糟糕,现在只打印结果。(从 ehow 获得)并且似乎选择了它想要输入/打印的内容。

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    ifstream input;
    input.open("00000000.dat");

    unsigned char h1,h2;

    do
    {
        input >> h1;
        cout << hex << (unsigned int)h1;
        input >> h2;
        cout << hex << (unsigned int)h2;
    }while(!input.eof());

cin.get();
return 0;
}

这是一个大文件,所以我无法向您展示它打印的内容,但它缺少一些字节。(例如“0A 00 00 0A 00 05.....”打印为“00 05.....”)结尾也是如此。

对不起,如果我没有很好地解释它:(

4

2 回答 2

8

如前所述,您应该将流作为二进制文件打开。>>如果您告诉它不要跳过空格,则可以使用常规运算符。

unsigned char x;
std::ifstream input("00000000.dat", std::ios::binary);
input >> std::noskipws;
while (input >> x) {
    std::cout << std::hex << std::setw(2) << std::setfill('0')
              << (int)x;
}

要将内容转换为字符串,您可以使用 anostringstream而不是cout.

于 2013-05-07T03:29:25.610 回答
0

您想打开文件以读取二进制文件。您现在正在阅读文本。所以它应该看起来像

//Open file object to read as binary
std::ifstream input("00000000.dat", std::ios::in | std::ios::binary);    

您可能还想使用 reinterpret_cast 一次读取一个字节(即无法弄清楚您想要什么——您的代码和您的描述正在做相反的事情)。

//Read until end of file
while(!input.eof())    
{

    //Or .good() if you're paranoid about using eof()

    //Read file one byte at a time
    input.read(reinterpret_cast<char *>(&h1), sizeof(unsigned char));

}

或者,如果您只想要一个字符串中的所有内容,为什么不直接声明一个字符串并将其读入其中呢?

于 2013-05-07T03:05:14.770 回答