gpt4 book ai didi

c++ - 使用 C++ 读取其中包含空字节的二进制文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:56:40 27 4
gpt4 key购买 nike

执行此操作的规范方法是什么?

我必须将此处的读入 wstring ,但我确定答案应该适用于 string还有。

这是我现在正在尝试的:

wifstream file(filename, ios::in | ios::binary);
// this next line is cleverer but works the same way (i.e. null byte stops it)
// return wstring(istreambuf_iterator<wchar_t>(file), istreambuf_iterator<wchar_t>());
wstring out;
wchar_t buf[8192];
while (true) {
file.read(buf, 8192);
streamsize len = file.gcount();
cerr << len << "chars read.";
out.append(buf, len);
if (len != 8192) break;
}
return out;

一旦遇到文件中的空字节,如何让它继续读取?

如果 POSIX 有一项法令防止空字节永远存在于任何文件中,我实际上不会感到惊讶。但显然 Vim 正在使用一些魔法将所有这些空值写入撤消文件格式。此外,如果您碰巧将内容编码或加密为随机字节流(或多种模拟采样),则必须产生空值。我的意思是,我可以继续:OS X 上的管道 (FIFO) 可以很好地处理通过它们的空字节:我可以 cat undofile,将其通过管道传输到 xxd,它可以读取。

这显然是我绊倒的一些简单的事情。它是什么?当然有一种 C++ 方法可以做到这一点。或者,也许您知道 <stdio.h> 的方法.我想知道。

例如,这是我正在测试的文件:

% cat .dmp.cpp.un\~| xxd | head                                   
0000000: 5669 6d9f 556e 446f e500 0218 96c6 25f6 Vim.UnDo......%.
0000010: 64bb 2301 6ed8 3578 5c50 61e0 eae5 a819 d.#.n.5x\Pa.....
0000020: b17d 53b5 f932 dc9d 40aa 1b00 0000 8500 .}S..2..@.......
0000030: 0000 5720 2020 2020 2020 2020 2020 2063 ..W c
0000040: 6572 7220 3c3c 2022 466f 756e 6420 616e err << "Found an
0000050: 2075 6e70 7269 6e74 6162 6c65 2063 6861 unprintable cha

字节 2b 是第一个空字节。程序读取 44 个字节 (2c),因此它写入第一个空字节,然后停在那里。

% la .dmp.cpp.un\~
-rw-r--r-- 1 lust staff 326836 Jul 4 01:41 .dmp.cpp.un~

P.S.,我在 here 的评论中得到了简洁的一行.可悲的是,它也遇到了这个问题。

最佳答案

我首先使用常规字符串解决了这个问题。

ifstream file(filename, ios::in | ios::binary);
wstring out;
char buf[8192];
while (true) {
file.read(buf, 8192);
streamsize len = file.gcount();
cerr << len << "chars read.";
string s(buf, len);
out.append(s.begin(), s.end());
if (len != 8192) break;
}
return out;

关于c++ - 使用 C++ 读取其中包含空字节的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17462685/

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