0

我正在尝试将文件打开到 C++ 中的位数组 (0,1) 中。我见过的每个例子都有字节,但我真的需要实际的位。是否有捷径可寻?该文件将小于 100 kB。

4

2 回答 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

直播:

http://ideone.com/Is7xRy

笔记:

  • bitsetsize 是一个非类型模板参数。您不能在运行时设置它。因此,这仅适用于位集的预分配,并且对于更大的位集,您将获得 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 回答