заполнение в векторе нулями - PullRequest
2 голосов
/ 26 марта 2020

Мой открытый текст сначала преобразуется в двоичный текст, затем он должен быть разделен на 64-битные блоки, а ключ должен отдельно шифроваться. например, если мой текст имеет 90 бит, он должен быть дополнен нулями, чтобы он имел 128 бит. Я не знаю, как это сделать. Вот мой код:

string ifile = "filetxt.txt";
string ofile = "file2.txt";
string key = "keywordd";
vector<int> k;
vector<int> txt;
char text;
vector<int> o;
int i;
int c = 0;
int d = 1;

void f() {
    ifstream ist ("filetxt.txt");
    ofstream ost ("file2.txt");
    int a[64], i;
    while (ist >> text) {
        for(char& text : key) {
            for(i=0; i < 8; i++){
                a[i] = text%2;
                text = text/2;
            }
            for(i=i-1; i >= 0 ;i--){
                k.push_back(a[i]);
            }
        }
        if (ist) {
            for(i=0; i < 8; i++){
                a[i] = text%2;
                text = text/2;
            }
            for(i=i-1 ;i >= 0 ;i--){
                txt.push_back(a[i]);
            }
            for(int j = 0; j < 8; j++) {
                if(k[j] == txt[j]) {
                    o.push_back(c);
                } else if (k[j] != txt[j]) {
                    o.push_back(d);
                }
            }
            for(i=0; i<8; i++) {
                ost << o[i];
            }
            for(i=0; i<8; i++) {
                cout << o[i];
            }
        }
    }
    cout << endl;
    for(i=0; i<64; i++) {
        cout << k[i];
    }
    cout << endl;
    for(i=0; i<64; i++) {
        cout << txt[i];
    }
}
int main()
{
    f();
    return 0;
}

Я должен был сделать что-то вроде этого:

if (txt.size()< 64){
    for(i= 0; i< 64- txt.size();i++){
        txt.push_back(c);
    }
}

Я думаю, что проблема в вектор TXT, потому что, если я хочу напечатать его, я

Ответы [ 3 ]

3 голосов
/ 26 марта 2020

Это очень просто:

if (txt.size()< 64)
    txt.resize(64);

Это просто добавит вектор со значением по умолчанию для int, которое равно 0.

Если вы хотите значение, отличное от 0 (c как подсказывает ваш код) тогда это:

if (txt.size()< 64)
    txt.resize(64, c);
2 голосов
/ 26 марта 2020

То, что вы хотите, это std::vector::resize. По умолчанию он увеличивает размер вектора до запрошенного размера (если вектор меньше указанного размера), и любые добавленные элементы будут инициализированы значением, что для int означает инициализированный ноль. Это дает вам

if (txt.size() % 64 != 0)
    txt.resize(txt.size() + (64 - (txt.size() % 64)));

Также обратите внимание, что 64 int это , а не 64 бит. int должен иметь размер не менее 16 битов, а значит 64 из них будут не менее 512 битов. Если вам действительно нужно иметь 64-битные порции, вы должны использовать std :: uint64_t для битовых порций (или что-то в этом роде)

1 голос
/ 26 марта 2020

В качестве последнего шага сделайте что-то вроде следующего:

if ((txt.size() % 64) != 0){
    for(i= 0; i< 64-((txt.size() % 64)); i++){
        txt.push_back(c);
    }
}

Таким образом, независимо от длины вашего открытого текста, ваш вектор txt всегда будет заканчиваться кратным длине 64, дополненной нулями ( c) при необходимости.

...