【问题标题】:Iterating through Vector 8 bytes at a time & performing bitwise operations一次遍历向量 8 个字节并执行按位运算
【发布时间】:2017-09-22 09:50:42
【问题描述】:

我有一个名为 vector1 的无符号字符向量,我想以 8 字节块的形式遍历该向量,并使用 std::transform 函数对每个块执行按位运算。变换函数将异或的数据存储在 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;
  }

这并没有按照我想要的方式执行。我还认为可能存在问题,因为我一次通过向量迭代 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));
  }
}

【问题讨论】:

  • 编辑:nvm,我理解错了你的问题^^
  • This is not performing the way I want it to. 什么意思??
  • @gsamaras 我使用密码计算器对数据进行 XOR 的预期输出。当我在运行转换后查看 vector2 时,值是:128 '\200',十六进制:0x80。如果 Vector1 是 5555555555555555 并且 KEY_IV 是 1111111111111111 我希望 vector2 是 4444444444444444
  • itr += 8 转换错误(未指定参数的评估顺序):您可能需要itr + 8
  • 谢谢@Jarod42,我将此添加到我的代码中,您是正确的,非常感谢。

标签: c++ vector iterator transform stdvector


【解决方案1】:

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

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>());

【讨论】:

  • 谢谢你。如果我在这里是正确的,那么断言是一个宏,它检查向量是 8 的倍数吗?如果您可以在底部查看我已编辑的问题,我已在代码中添加以检查我的向量是否为 8 的倍数,如果不是,则用 0 填充
  • 至于推进目的地,这里是我可能做错的地方。我基本上想输入存储在vector1中的纯文本数据。对此明文数据执行异或运算并将其存储在 vector2 中。然后将此数据加密并附加到一个更大的向量中,我简称为 encryptedData。因此,8 字节的 XOR 数据块被添加到包含所有内容的 encryptedData 向量中。我一次异或 8 个字节,因为我认为这会运行得更好,但是我可能又错了。我是新手,边走边学,谢谢:)
  • vector2 最初是否包含任何值?是和vector1一样大小,还是8?
  • 另外,如果你打算使用这个加密来做任何事情,而不仅仅是把它写成一个学习练习,我强烈建议不要写它 而是找到一个(适当许可的)库来为您加密。
  • @Zeus7 如果vector2 开始为空,那么您需要std::back_inserter(vector2),它每次都会在末尾添加一个新元素。
猜你喜欢
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2017-11-23
  • 2018-06-22
  • 1970-01-01
  • 2023-01-04
相关资源
最近更新 更多