首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次迭代向量8个字节&执行按位操作

一次迭代向量8个字节&执行按位操作
EN

Stack Overflow用户
提问于 2017-09-22 09:50:42
回答 1查看 393关注 0票数 0

我有一个名为vector1的无符号字符向量,我想以8个字节的块迭代该向量,并使用std::transform函数对每个块执行位操作。transform函数将XOR的数据存储在vector2中。以下是我目前所拥有的:

代码语言:javascript
复制
 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的乘积校验vector1。

代码语言:javascript
复制
// 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));
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-22 10:35:17

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

代码语言:javascript
复制
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个元素。你是想提前到达目的地吗?

代码语言:javascript
复制
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次数,然后执行最后的较短的xor,可以使这更安全(放弃断言)。

代码语言:javascript
复制
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>());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46361782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档