以 binary/hex 读取文件
Read a file as binary/hex
我目前正在尝试将文件读取为十六进制值,就像十六进制编辑器所做的那样。为了解释这个问题,我们假设我有一个 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 post 为什么你不应该这样做
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) << " ";
}
我目前正在尝试将文件读取为十六进制值,就像十六进制编辑器所做的那样。为了解释这个问题,我们假设我有一个 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 post 为什么你不应该这样做
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) << " ";
}