如何从文件中正确输入二进制文件

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 数字类型。