gpt4 book ai didi

c++ - 读取文件为二进制/十六进制

转载 作者:行者123 更新时间:2023-12-02 10:13:23 29 4
gpt4 key购买 nike

我目前正尝试像十六进制编辑器一样将文件读取为十六进制值。为了解释这个问题,让我们假设我有一个test.txt,里面有一个简单的“Hello world”。我正在尝试使用接近以下代码的程序以十六进制形式读取。

#include <iostream>
#include <fstream>

int main(int argc, char* argv[]) {
std::ifstream stream;
stream.open("test.txt", std::ios_base::binary);
if (!stream.bad()) {
std::cout << std::hex;
std::cout.width(2);

while (!stream.eof()) {
unsigned char c;
stream >> c;
std::cout << static_cast<unsigned>(c) << " ";
}
}

return 0;
}
作为终端中的输出,我得到了
nux@pc-lubuntu:~/repos/readingHex$ od -x test.txt 
0000000 6548 6c6c 206f 6f77 6c72 0a64
0000014
nux@pc-lubuntu:~/repos/readingHex$ ./a.out
48 65 6c 6c 6f 77 6f 72 6c 64 64
显然,字节序之间存在差异,但这应该很容易纠正。但是,如您在输出日志上看到的,结果在字节5-6和9-10处有所不同。有人有解决此问题的想法吗?
谢谢。

最佳答案

更改为:

while (!stream.eof()) {
unsigned char c;
stream >> c;
std::cout << static_cast<unsigned>(c) << " ";
}
这个:
unsigned char c{};
stream >> std::noskipws;
while (stream >> c) {
std::cout << static_cast<unsigned>(c) << " ";
}
  • std::noskipws 禁止跳过空格。
  • 阅读this出色的SO帖子,介绍为什么不应该使用while (!stream.eof())

  • 另外,您也可以使用 read:
            stream.seekg(0, stream.end);
    int length = stream.tellg();
    stream.seekg(0, stream.beg);

    std::vector<char> buffer(length);

    stream.read(&buffer[0], length);

    for (auto c : buffer) {
    std::cout << static_cast<unsigned>(c) << " ";
    }

    关于c++ - 读取文件为二进制/十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62734135/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com