我需要从二进制文件中读取16位std::string
或char *
。例如,二进制文件包含89 ab cd ef
,我希望能够将它们提取为std::string
或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”。有可能实现吗?
答案 0 :(得分: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";
}
答案 1 :(得分:0)
您无法读取二进制流,就像它是文本一样。
当然可以读取为二进制文件(通过在流对象上使用“file.read()”和“file.write()”方法)。就像你现在正在做的那样:)
您还可以将二进制文件转换为文本:“转换为十六进制文本字符串”和“uuencode base 64”是执行此操作的两种常用方法。
答案 2 :(得分:0)
您希望将字节读取为数字(可能是long long类型)。 然后,您可以使用格式说明符like this打印它们:
#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;
}