Затруднения с типами данных, 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: Несколько изменил код. Теперь выводит только результат ^ с ключом и первым символом (посчитал верно). Остальные почему-то не трогает.


Ответы (0 шт):