我正在尝试将文件打开到 C++ 中的位数组 (0,1) 中。我见过的每个例子都有字节,但我真的需要实际的位。是否有捷径可寻?该文件将小于 100 kB。
问问题
365 次
2 回答
0
#include <bitset>
#include <sstream>
#include <iostream>
#include <cinttypes>
namespace my
{
template<size_t S>
std::istream &operator >> (std::istream &is, std::bitset<S> &bits)
{
std::uint8_t byte;
size_t i = 0;
while(i < S && (is >> byte))
for(size_t j = 0; j < 8 && i < S; ++j)
bits[i++] = (byte >> j) & 1;
return is;
}
}
int main()
{
constexpr size_t bytes = 2;
std::string bit_string("\x00\xFF", bytes);
std::istringstream bit_stream(bit_string);
std::bitset<8 * bytes> b;
{
using namespace my;
bit_stream >> b;
}
std::cout << b << std::endl;
for(size_t i = 0; i < b.size(); ++i)
std::cout << b[i];
std::cout << std::endl;
}
输出:
1111111100000000
0000000011111111
直播:
笔记:
bitset
size 是一个非类型模板参数。您不能在运行时设置它。因此,这仅适用于位集的预分配,并且对于更大的位集,您将获得 0 填充。- 如果您想要一个运行时大小的位集,请查看boost::dynamic_bitset。
istringstream
该示例只需通过适当地替换即可适用于文件ifstream
。
于 2013-05-16T00:42:09.297 回答
0
问题之一std::bitset
是您必须模板化大小。您可以手动读取它...
char c;
vector<char> bytes;
int nread = 0;
while( in.get(c) )
{
if( nread == 0 ) bytes.push_back(0);
bytes.back() = (bytes.back() << 1) | (c ? 1 : 0);
nread = (nread + 1) % 8;
}
于 2013-05-15T22:45:28.557 回答