1

我需要从二进制文件中读取 16 位std::stringchar *. 例如,一个二进制文件包含89 ab cd ef,我希望能够将它们提取为std::strings 或char *. 我尝试了以下代码:

ifstream *p = new ifstream();
char *buffer;  
p->seekg(address, ios::beg);  
buffer = new char[16];  
memset(buffer, 0, 16);  
p->read(buffer, 16);  

当我尝试std::cout缓冲区时,什么都没有出现。如何在二进制文件中读取这些字符?

编辑:我一直在寻找缓冲区是 int 类型,例如“0x89abcdef”。有没有可能实现?

4

3 回答 3

4

就像是:

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

int main()
{
    if (ifstream input("filename"))
    {
        std::string s(2 /*bytes*/, '\0' /*initial content - irrelevant*/);
        if (input.read(&s[0], 2 /*bytes*/))
            std::cout << "SUCCESS: [0] " << std::hex << (int)s[0] << " [1] " << (int)s[1] << '\n';
        else
            std::cerr << "Couldn't read from file\n";
    }
    else
        std::cerr << "Couldn't open file\n";
}
于 2012-06-14T01:00:18.573 回答
0

您不能像读取文本一样读取二进制流。

当然,您可以读取二进制文件(通过在您的流对象上使用“file.read()”和“file.write()”方法)。就像你现在正在做的那样:)

您还可以将二进制转换为文本:“转换为十六进制文本字符串”和“uuencode base 64”是执行此操作的两种常用方法。

于 2012-06-14T00:51:01.047 回答
0

您需要将字节读取为数字(可能是 long long 类型)。然后您可以使用如下格式说明符打印那些:

#include <iostream>
#include <iomanip>

int main()
{
    using namespace std;

    int x =   2;
    int y = 255;

    cout << showbase // show the 0x prefix
         << internal // fill between the prefix and the number
         << setfill('0'); // fill with 0s

    cout << hex << setw(4) << x << dec << " = " << setw(3) << x << endl;
    cout << hex << setw(4) << y << dec << " = " << setw(3) << y << endl;

    return 0;
}
于 2012-06-14T01:00:53.690 回答