我有一个名为 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/