c++ - 一次迭代 Vector 8 字节并执行按位运算

标签 c++ vector iterator transform stdvector

我有一个名为 vector1 的无符号字符 vector ,我想以 8 字节为单位遍历该 vector ,并使用 std::transform 函数对每个 block 执行按位运算。转换函数将 XOR 数据存储在 vector2 中。这是我目前拥有的:

 for (std::vector<unsigned char>::iterator itr = vector1.begin(); itr != vector1.end(); itr += 8)
 { 
    // vector1 data XOR'd with KEY_IV data and output to vector2
    std::transform(itr, itr += 8, std::begin(KEY_IV), std::begin(vector2), std::bit_xor<unsigned char>());

    if (itr == vector1.end())
      break;
  }

这没有按照我想要的方式执行。我还认为可能存在问题,因为我一次通过 vector 迭代 8 个字节,并且还在转换函数中执行相同的操作。我在转换中需要两个 (itr, itr += 8) 吗?

谢谢。

编辑 检查 vector1 是否为 8 的倍数,如果不是,则用 0 填充

// check vector1 for multiples of 8, if not, pad out with 0's
for (std::vector<unsigned char>::iterator itr = vector1.begin(); itr != vector1.end(); itr += 8)
{
  if ((vector1.size() % 8) != 0)
  {
    vector1.push_back(fmod(vector1.size(), 8));
  }
}

最佳答案

你正在变异 itr在调用 std::transform .您有未指定的行为,因为它再次出现在参数列表中。

assert((vector1.size() % 8) == 0, "bad times!");
for (std::vector<unsigned char>::iterator itr = vector1.begin(); itr != vector1.end(); itr += 8)
{ 
  // vector1 data XOR'd with KEY_IV data and output to vector2
  std::transform(itr, itr + 8, std::begin(KEY_IV), std::begin(vector2), std::bit_xor<unsigned char>());
}

std::begin(vector2)也很可疑,您只写过 vector2 的前 8 个元素.你的意思是提前到达目的地?

assert((vector1.size() % 8) == 0, "bad times!");
auto dest = std::begin(vector2);
for (auto itr = vector1.begin(); itr != vector1.end(); itr += 8)
{ 
  // vector1 data XOR'd with KEY_IV data and output to vector2
  dest = std::transform(itr, itr + 8, std::begin(KEY_IV), dest, std::bit_xor<unsigned char>());
}

这可以通过循环 vector1.size() / 8 变得更安全(丢弃断言)次,然后执行最后一个较短的异或运算。

size_t count = vector1.size() / 8;
auto itr = vector1.begin();
auto dest = std::begin(vector2);
for (; --count; itr += 8)
{ 
  // vector1 data XOR'd with KEY_IV data and output to vector2
  dest = std::transform(itr, itr + 8, std::begin(KEY_IV), dest, std::bit_xor<unsigned char>());
}
std::transform(itr, vector1.end(), std::begin(KEY_IV), dest, std::bit_xor<unsigned char>());

关于c++ - 一次迭代 Vector 8 字节并执行按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46361782/

相关文章:

c++ - 增加一个常量前向迭代器

java - 迭代器和 hasNext() 电源实现

c++ - 如何调试 Winsock API 调用?

python - cython return 语句给出了一个内置方法而不是整数

c++ - 载体如何清理自己? (或者他们呢?)

python - 为什么变量的值在作为列表附加到 python 列表时会发生变化?

python - 从列表字典创建 n 个嵌套循环

c++ - 像 '__LINE__' 一样,C/C++ 中是否有打印线程名称或 ID 的标准宏?

c++ - 在 MSVC 中将某些库的目标平台版本设置为 10.x 是否会使程序不兼容在 Windows Vista/7/8 上运行?

C++ 访问存储在 vector 中的对象的元素