如何从文件中正确输入二进制文件
How to correctly input binary from a file
我正在尝试制作一个十六进制编辑器,我想从一个文件中读取。为此,我正在使用 fsteam。我对这个库还不是很熟悉,所以我不确定我做错了什么。
我想做的是将文件的前 8 位(1 字节)读取为二进制文件,然后将其转换为十六进制并显示。我的问题是我不确定如何获得 8 位。下面的代码用文件的第一个字符(“H”)填充字符数组。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string path = "c:/users/sjames/desktop/s.txt";
vector<char> buffer(1, 0);
fstream file;
file.open(path, ios::binary | ios::in);
if (file.is_open())
{
file.read(&buffer[0], buffer.size());
for (int i = 0; i < buffer.size(); i++)
{
cout << buffer[i, 0] << endl;
}
file.close();
}
return 0;
}
I want to read 8 bits or 1 byte. And I want to input it in binary.
所以,那么简单read()
1个字节。您显示的代码是 read()
'ing 8 个字节。一个 char
是 1 个字节,而你正在创建一个 vector
,里面有 8 个 char
。
试试这个:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
int main()
{
string path = "c:/users/sjames/desktop/s.txt";
unsigned char b;
ifstream file(path, ios::binary);
if (file.is_open())
{
if (file.read(reinterpret_cast<char*>(&b), 1))
cout << hex << setw(2) << setfill('0') << static_cast<unsigned short>(b) << endl;
file.close();
}
return 0;
}
然后您可以根据需要展开显示多个字节:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
string path = "c:/users/sjames/desktop/s.txt";
vector<unsigned char> buffer(...); // TODO: query the file's size, perhaps...
ifstream file(path, ios::binary);
if (file.is_open())
{
if (file.read(reinterpret_cast<char*>(buffer.data()), buffer.size()))
{
size_t numRead = file.gcount();
for (size_t i = 0; i < numRead; ++i)
{
cout << hex << setw(2) << setfill('0') << static_cast<unsigned short>(buffer[i]) << endl;
}
file.close();
}
}
return 0;
}
仅供参考,注意在使用 operator<<
时类型转换为 unsigned short
。这是因为 std::ostream
已重载 operator<<
](https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2) 以将 [(un)signed] char
值视为文本],而不是数字。因此,如果您想将 char
作为数字打印出来,即使是十六进制格式,您也需要将 char
转换为非 char
数字类型。
我正在尝试制作一个十六进制编辑器,我想从一个文件中读取。为此,我正在使用 fsteam。我对这个库还不是很熟悉,所以我不确定我做错了什么。
我想做的是将文件的前 8 位(1 字节)读取为二进制文件,然后将其转换为十六进制并显示。我的问题是我不确定如何获得 8 位。下面的代码用文件的第一个字符(“H”)填充字符数组。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string path = "c:/users/sjames/desktop/s.txt";
vector<char> buffer(1, 0);
fstream file;
file.open(path, ios::binary | ios::in);
if (file.is_open())
{
file.read(&buffer[0], buffer.size());
for (int i = 0; i < buffer.size(); i++)
{
cout << buffer[i, 0] << endl;
}
file.close();
}
return 0;
}
I want to read 8 bits or 1 byte. And I want to input it in binary.
所以,那么简单read()
1个字节。您显示的代码是 read()
'ing 8 个字节。一个 char
是 1 个字节,而你正在创建一个 vector
,里面有 8 个 char
。
试试这个:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
int main()
{
string path = "c:/users/sjames/desktop/s.txt";
unsigned char b;
ifstream file(path, ios::binary);
if (file.is_open())
{
if (file.read(reinterpret_cast<char*>(&b), 1))
cout << hex << setw(2) << setfill('0') << static_cast<unsigned short>(b) << endl;
file.close();
}
return 0;
}
然后您可以根据需要展开显示多个字节:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
string path = "c:/users/sjames/desktop/s.txt";
vector<unsigned char> buffer(...); // TODO: query the file's size, perhaps...
ifstream file(path, ios::binary);
if (file.is_open())
{
if (file.read(reinterpret_cast<char*>(buffer.data()), buffer.size()))
{
size_t numRead = file.gcount();
for (size_t i = 0; i < numRead; ++i)
{
cout << hex << setw(2) << setfill('0') << static_cast<unsigned short>(buffer[i]) << endl;
}
file.close();
}
}
return 0;
}
仅供参考,注意在使用 operator<<
时类型转换为 unsigned short
。这是因为 std::ostream
已重载 operator<<
](https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2) 以将 [(un)signed] char
值视为文本],而不是数字。因此,如果您想将 char
作为数字打印出来,即使是十六进制格式,您也需要将 char
转换为非 char
数字类型。