我有一个名为vector1的无符号字符向量,我想以8个字节的块迭代该向量,并使用std::transform函数对每个块执行位操作。transform函数将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;
}这不是我想要的方式。我还认为可能会有一个问题,因为我一次在向量中迭代8个字节,并且在转换函数中也这样做。在转换过程中需要两者( itr,itr += 8)吗?
谢谢。
编辑检查vector1是否为8的倍数,如果不是,则用0的乘积校验vector1。
// 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));
}
}发布于 2017-09-22 10:35:17
您正在对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次数,然后执行最后的较短的xor,可以使这更安全(放弃断言)。
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>());https://stackoverflow.com/questions/46361782
复制相似问题