C++:字符串和int之间的XOR



假设我有两个向量:

std::vector<int> numbers;
std::vector<std::string> words;

我读了两个文件:一个只有数字,另一个有单词。我想用数字作为我的单词的密码,因此numbersXORwords将是ciphertextciphertextXORnumbers将还给我words

我正在尝试做一些类似的事情

int charCount = wordsCount >= numbersCount ? numbersCount : wordsCount;
for (int i = 0; i < charCount; i++) {
result[i] = words[i] ^ numbers[i];
}

但这不起作用

no match for 'operator^' (operand types are '__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char> >::value_type' {aka 'std::__cxx11::basic_string<char>'} and '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'})|

我怎样才能用最简单的方法呢?

UPD:所以我真正想要的是把单词中的每个字符和下面的数字异或。

如果您想用相应的数字对一个单词的所有字符进行异或运算,您需要对每个字符进行迭代。没有办法用operator^对字符串的所有字符进行异或运算。

你可以做这个

std::transform(std::begin(numbers), 
std::begin(numbers) + std::min(numbers.size(), words.size()),
std::begin(words),
std::begin(words),
[](auto number, auto word)
{
std::transform(std::begin(word), std::end(word), 
std::begin(word), 
[number](auto c)
{ return c ^ number; });
return word;
});

它是对称的,因此可以用于编码和解码。

我很少建议这样做,但在这种情况下,传统的for循环可能更可读:

int min = std::min(numbers.size(), words.size());
for (int i = 0; i < min; ++i) 
for (int j = 0; j < words[i].size(); ++j)
words[i][j] = words[i][j] ^ numbers[i];

最新更新