Затруднения с типами данных, std::bitset
В коде ниже foo() формирует ключ (берется крайний левый элемент формируемой последовательности). Далее этот ключ используется для шифрования сообщения с помощью ^. То есть, каждый символ слова должен быть проксорен с ключом. Для этого использую функцию ENCODE. Результаты получаются неверные. Заметил, что, если меняю std::bitset<1> на std::bitset<8>, результат получается разный (что логично). С std::bitset<1> выводит более правильно. В чем может быть проблема?
#include <iostream>
#include <bitset>
#include <string>
#include <vector>
#include <iomanip>
unsigned foo(char key2[]) {
uint32_t state = 0b1111111111111111111111111111111;
uint32_t start_state2{ state };
uint32_t period {0};
uint32_t bit2 {0};
do {
bit2 = ((state >> 31) ^ (state >> 30) ^ (state >> 29) ^ (state >> 25) ^ state);
//bit2 = key2[period];
key2[period] = bit2;
//std::cout << std::bitset<8>(key2[period]) << " ";
state = (state >> 1) | (bit2 << 31);
std::cout << std::bitset<32>(state) << std::endl;
period++;
} while ((period != 15) && (start_state2 != state));
std::cout << "Period: " << period << std::endl;
}
const int SIZE{8};
std::string ENCODE(std::string& data, char key2[]) {
std::string output = " ";
for (int j=0; j < data.size(); ++j) {
std::bitset<1> d(data[j]);
std::bitset<1> k(key2[j]);
for(int i=0; i < 8; ++i) {
std::bitset<1> d(data[i]);
std::bitset<1> k(key2[i]);
// std::cout << std::bitset<8>(key2[i]) << " ";
// output[i] = d ^ k;
std::cout << (d ^ k);
}
std::cout << " ";
}
return output;
}
int main() {
unsigned start_state2;
char* key2;
foo(key2);
std::string data;
data = "Hello";
std::cout << "\nData string: " << data << '\n';
for(int i = 0; i < data.size(); i++) {
std::bitset<8> d(data[i]);
std::cout << d << ' ';
}
std::cout << '\n';
std::cout << "Key: ";
for(int i=0; i < 8; ++i) {
std::cout << std::bitset<1>(key2[i]);
}
std::cout << '\n';
ENCODE(data, key2);
return 0;
}
OUTPUT
Data string: Hello
01001000 01100101 01101100 01101100 01101111 //КАЖДЫЙ СИМВОЛ СЛОВА В ASCII
Key: 01100100
00101100 00101100 00101100 00101100 00101100 //РЕЗУЛЬТАТ ^ С КЛЮЧОМ
UPD: Несколько изменил код. Теперь выводит только результат ^ с ключом и первым символом (посчитал верно). Остальные почему-то не трогает.