【问题标题】:how to combine binary nth bit of char vector如何组合char向量的二进制第n位
【发布时间】:2017-10-06 21:54:08
【问题描述】:

习惯于在 python 中工作并尝试抽象如何访问单个 char 向量项的二进制元素。问题是python非常慢,我正在将它翻译成c++。我有一个二进制文件,我将文件读入std::vector<char> buffer(1024),数据被组织成有 32 个通道,每个通道长 32 个字节(256 位)。一个样本由来自 32 个通道中的每个通道的 1 位组成。因此,一组中有 256 个样本。将每个 32 字节通道的第 n 位组合成样本的最佳读取方法是什么? Python有一个位串模块,在c++中有什么相关的吗?

我不是在问如何将原始二进制数据读入位集向量。我在问如何读取 char 向量的第 n 位。

【问题讨论】:

  • 为什么要读入 std::vector
  • 数据是条带化的吗,就像你想把第 0 位、第 32 位、第 64 位等组合起来制作样本一样,那么其余的位也一样?
  • @lorro 我希望能够轻松地将不同的字节连接成一个新的向量,所以看起来使用向量是正确的答案。但我正在尝试深入到比特级别,所以也许有更好的方法。

标签: c++ vector binary


【解决方案1】:

不要将文件读入std::vector<unsigned char>,而是使用std::vector<std::bitset<32>>

首先,将文件读入std::bitset-s 的std::vector。因为它只有一个来自unsigned long 的构造函数,所以我们必须这样做:

std::vector<std::bitset<32>> batches;
std::ifstream fin(<path>, std::ios::binary);
uint32_t x;
while (fin >> x)
    batches.emplace_back(x);

现在,我们有一个包含 256 批 32 位的向量。让我们从中创建样本:

std::vector<std::bitset<256>> samples;
for (unsigned i = 0; i < 32; i++) {
    std::bitset<256> sample;
    for (unsigned j = 0; j < 256; j++)
        sample[j] = batches[j][i];
    samples.push_back(sample);
}

现在您的样本向量包含 32 个样本,每个样本 256 位。

samples[i] // <-- Sample i
samples[i][j] // <-- Bit j in sample i

【讨论】:

  • 您正在解析 uint,而不是读取原始数据...我建议读取 4 个字符并将它们组合成 uint。
  • @lorro,将 fstream 固定为二进制模式。
  • 啊,滚动 :)(在手机上看)
  • 您可能想使用fin.read(...) 读取二进制数据,而不是格式化输入。
猜你喜欢
  • 2015-01-16
  • 2015-04-06
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多