Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <thread>
- using namespace std;
- typedef vector<char>::const_iterator ci;
- void izracunajXOR(ci poc, ci kraj, vector<char>& keys, vector<char>& rezultat) {
- char rez;
- int j = 0;
- while (poc < kraj && j < keys.size()) {
- rez = *poc ^ keys[j];
- rezultat.push_back(rez);
- //cout << "i: " << poc << ", j:" << j << ", i^j:" << (int)rez << endl;
- poc = poc + 1;
- j++;
- // Provera da li su iterirani kljucevi do kraja.
- // Ako jesu, resetuj brojac za kljuceve, ali ne i brojac od prvog vektora
- // Na ovaj nacin se nece nastaviti loop ukoliko su iste duzine
- if (j == keys.size()) {
- j = 0;
- }
- }
- }
- vector<char> sumirajXOR(vector<char> ulaz1, vector<char> keys, int brojNiti) {
- vector<char> rezultati[32];
- for (int i = 0; i < 32; i++) rezultati[i] = vector<char>();
- int kolicinaPosla = ulaz1.size() / brojNiti;
- ci begin = ulaz1.begin();
- ci end = ulaz1.begin() + kolicinaPosla;
- thread threads[32];
- for (int i = 0; i < brojNiti - 1; i++) {
- threads[i] = thread(izracunajXOR, begin, end, ref(keys), ref(rezultati[i]));
- begin = end;
- end = begin + kolicinaPosla;
- }
- begin = end;
- end = ulaz1.end();
- threads[brojNiti] = thread(izracunajXOR, begin, end, ref(keys), ref(rezultati[brojNiti]));
- for (int i = 0; i < brojNiti; ++i) {
- threads[i].join();
- }
- // Spajanje vektora u jedan
- vector<char> rezultat;
- for (int i = 0; i < brojNiti; i++) {
- vector<char>::const_iterator it = rezultati[i].begin();
- while (it <= rezultati[i].end()) {
- char x = *it;
- rezultat.push_back(x);
- it++;
- }
- }
- return rezultat;
- }
- int main(int argc, char* argv[])
- {
- // Zadatak 1
- ifstream fajl1(argv[1], ios::binary);
- unsigned int length1;
- vector<char> vektor1;
- fajl1.read((char*)&length1, sizeof(length1));
- cout << argv[1] << endl << length1 << endl << endl;
- for (int i = 0; i < length1; i++) {
- char x;
- fajl1.read((char*)&x, sizeof(char));
- vektor1.push_back(x);
- //cout << (int)x << endl;
- }
- // Zadatak 2
- ifstream fajl2(argv[2], ios::binary);
- unsigned int length2;
- vector<char> vektor_kljuceva;
- fajl2.read((char*)&length2, sizeof(length2));
- cout << argv[2] << endl << length2 << endl;
- for (int i = 0; i < length2; i++) {
- char x;
- fajl2.read((char*)&x, sizeof(char));
- vektor_kljuceva.push_back(x);
- //cout << (int)x << endl;
- }
- // Zadatak 3
- vector<char> vektor_rezultat;
- char rez;
- int i = 0, j = 0;
- while (i < length1 && j < length2) {
- rez = vektor1[i] ^ vektor_kljuceva[j];
- vektor_rezultat.push_back(rez);
- cout << "i: " << i << ", j:" << j << ", i^j:" << (int)rez << endl;
- i++;
- j++;
- // Provera da li su iterirani kljucevi do kraja.
- // Ako jesu, resetuj brojac za kljuceve, ali ne i brojac od prvog vektora
- // Na ovaj nacin se nece nastaviti loop ukoliko su iste duzine
- if (j == length2) {
- j = 0;
- }
- }
- // Zadatak 4
- ofstream fajl3(argv[3], ios::binary);
- fajl3.write((char*)&length1, sizeof(length1));
- for (int i = 0; i < length1; i++) {
- fajl3.write((char*)&vektor_rezultat[i], sizeof(char));
- }
- cout << "Pisanje u fajl: " << argv[3] << endl;
- // Zadatak paralelizma
- int brojNiti = atoi(argv[4]);
- cout << "Krece paralelno izracunavanje sa sledecim brojem niti: " << brojNiti;
- vector<char> rezultat_paralelizma = sumirajXOR(vektor1, vektor_kljuceva, brojNiti);
- cout << "Paralelno izracunat";
- // Pisanje paralelizma
- ofstream fajlParalelizam("paralelizam.dat", ios::binary);
- fajlParalelizam.write((char*)&length1, sizeof(length1));
- for (int i = 0; i < length1; i++) {
- fajlParalelizam.write((char*)&rezultat_paralelizma[i], sizeof(char));
- }
- cout << "Pisanje u fajl: paralelizam.dat" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement