Advertisement
Guest User

Untitled

a guest
May 30th, 2015
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.72 KB | None | 0 0
  1. import java.util.Arrays;
  2. import java.util.BitSet;
  3. import java.util.InputMismatchException;
  4. import java.util.Random;
  5. import java.util.Scanner;
  6. import java.io.BufferedReader;
  7. import java.io.FileReader;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11.  
  12. import acm.program.ConsoleProgram;
  13.  
  14. //import acm.program.ConsoleProgram;
  15. // (16,7) 9,8,1,0  czyli czesc informacyjna
  16. public class kodowanie extends ConsoleProgram {
  17.  
  18.     private static final long serialVersionUID = 1L;
  19.     public String choice_s;
  20.     static int choice_i = 0;
  21.     int d = 1000, t, l;
  22.     // long wielomian_generujacy;
  23.     // long dzielna_l;
  24.     // long jebany_szajs_wcie;
  25.     // String zakodowany_string;
  26.     String binary;
  27.     private Scanner input;// to nam pilnuje czy bzdur nie wklepujemy
  28.     String stringset;// to jest nasze zakodowane slowo
  29.     String wielomian_generujacy_s = "11000000011";
  30.     // long modulo[];
  31.     BitSet bsh[]; // macierz kontrolna h transponowana
  32.     BitSet bs[]; // macierz generujaca
  33.     BitSet reszta[];
  34.     long macierz_generujaca[];
  35.     int bin_l = 8;
  36.     int dlugosc_n = bin_l + wielomian_generujacy_s.length() - 1;
  37.  
  38.     public void run() {
  39.         setSize(800, 600);
  40.         // dzielna_l = 0;
  41.         // String binary_l_f = "";
  42.         // String cz_info=readLine("podaj informacje");
  43.  
  44.         ArrayList<String> tablica_ascii = new ArrayList<>();// do tego potrzebna
  45.                                                             // jest jre 1.7
  46.         String filename = "tablica_ascii.txt";
  47.         try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
  48.             String line;
  49.             while ((line = br.readLine()) != null)
  50.                 tablica_ascii.add(line);
  51.  
  52.         } catch (IOException e) {
  53.             println("nie ma takiego pliku");
  54.         }
  55.  
  56.         HashMap<String, String> mapa_ascii = new HashMap<String, String>();
  57.  
  58.         for (String konkretny_znak : tablica_ascii) {
  59.             int i = konkretny_znak.lastIndexOf(",");
  60.             String bin = konkretny_znak.substring(0, i).trim();
  61.             String znak = konkretny_znak.substring(i + 1);
  62.             mapa_ascii.put(znak, bin);
  63.  
  64.         }
  65.  
  66.         // String binary = readLine("podaj ciag dlugosci 7: ");
  67.  
  68.         macierz_generujaca = new long[bin_l];
  69.  
  70.         // tu na stale mamy podany nasz
  71.  
  72.         long dzielna = (long) java.lang.Math.pow(2,
  73.                 wielomian_generujacy_s.length() - 1);// 0b10000000000;
  74.         long dzielnik = Long.parseLong(wielomian_generujacy_s, 2);// 0b11000000011;
  75.         // zwraca dlugosc ciagu binary
  76.         int dlugosc_n = wielomian_generujacy_s.length() + bin_l - 1;// zwraca
  77.                                                                     // dlugosc
  78.                                                                     // calego
  79.                                                                     // ciagu
  80.         int j = bin_l;
  81.  
  82.         bs = new BitSet[bin_l];// macierz generujaca
  83.         reszta = new BitSet[wielomian_generujacy_s.length()]; // reszta z
  84.                                                                 // dzielenia
  85.                                                                 // (nie pamietam
  86.                                                                 // zmiennej
  87.         BitSet bsf = BitSet.valueOf(new long[] { 0 });// koncowy wynik
  88.         for (int i = bin_l - 1; i >= 0; i--) {
  89.             bs[i] = BitSet.valueOf(new long[] { (long) java.lang.Math.pow(2,
  90.                     dlugosc_n - j) });
  91.             BitSet bs1 = BitSet.valueOf(new long[] { dzielna });
  92.             BitSet bs2 = BitSet.valueOf(new long[] { dzielnik });
  93.             bs1.xor(bs2);
  94.             reszta[i] = bs1;
  95.             bs[i].xor(bs1);
  96.  
  97.             dzielna = (int) bitSetToInt(bs1);
  98.             dzielna *= 2;
  99.             j--;
  100.  
  101.         }
  102.         while (true) {
  103.             boolean czyNieDziala = false;
  104.             println("1- kodowanie");
  105.             println("2- dorzuc bledy");
  106.             println("3- dekodowanie");
  107.             println("4- exit");
  108.             do {
  109.                 input = new Scanner(System.in);
  110.                 println("co wybierasz ");
  111.                 try {
  112.                     choice_i = Integer.parseInt(readLine("podaj i"));
  113.                     // choice_i = input.nextInt();
  114.                     if (choice_i < 5)
  115.                         czyNieDziala = false;
  116.                 } catch (NumberFormatException n) {
  117.                     println("Zle wpisane dane");
  118.                     czyNieDziala = true;
  119.  
  120.                 }
  121.  
  122.             } while (czyNieDziala || choice_i > 4 || choice_i < 0);
  123.             switch (choice_i) {
  124.             case 1: {
  125.                 koder(bsf, mapa_ascii);
  126.                 break;
  127.             }
  128.             case 2: {
  129.                 bledy();
  130.                 break;
  131.             }
  132.             case 3: {
  133.                 dekoder(mapa_ascii);
  134.                 break;
  135.             }
  136.             case 4: {
  137.                 System.exit(0);
  138.             }
  139.             }
  140.         }
  141.     }
  142.  
  143.     private void koder(BitSet bsf, HashMap<String, String> mapa_ascii) {
  144.  
  145.         String pytanie = readLine("podaj znak (uwaga obslugiwane sa tylko znaki z zakresu <32-126>: ");
  146.         pytanie.trim();// trim usuwa nam spacje na poczatku i na koncu
  147.         char x[] = pytanie.toCharArray();
  148.         for (int i = 0; i < pytanie.length(); i++) {
  149.             String znaczek = String.valueOf(x[i]);
  150.             if (!mapa_ascii.containsKey(znaczek)) {
  151.  
  152.             } else {
  153.                 binary = (mapa_ascii.get(znaczek));// tutaj mamy binarny
  154.                                                     // odpowiednik naszej litery
  155.             }
  156.         }
  157.         println("string binary=" + binary);
  158.         char wgc[] = binary.toCharArray();
  159.         for (int i = 0; i < bin_l; i++) {
  160.  
  161.             if (wgc[i] == '1')// (BigInteger.valueOf(Long.parseLong(binary,2)).testBit(i))//(wgc[i]=='1')
  162.             {
  163.                 bsf.xor(bs[i]);
  164.                 // println("bsf"+bsf.toString());
  165.             }
  166.  
  167.         }
  168.         println("bsf" + bsf);
  169.         long longset = bitSetToInt(bsf);
  170.         stringset = Long.toBinaryString(longset);
  171.  
  172.         while (stringset.length() < dlugosc_n) {
  173.             stringset = '0' + stringset;
  174.         }
  175.         println("stringset" + stringset);
  176.  
  177.     }
  178.  
  179.     public void dekoder(HashMap<String, String> mapa_ascii) {
  180.         BitSet gotowe[] = new BitSet[(int) java.lang.Math.pow(2, bin_l)];
  181.         // gotowe[] = BitSet.valueOf(new long[] { (1});
  182.         BitSet slowa_mozliwe[] = new BitSet[(int) java.lang.Math.pow(2, bin_l)];
  183.         BitSet bsr[] = new BitSet[bin_l];
  184.         for (int i = 0; i < bin_l; i++) {
  185.             bsr[i] = bs[bin_l - i - 1];
  186.         }
  187.  
  188.         for (int i = 0; i < (int) java.lang.Math.pow(2, 8); i++) {
  189.             slowa_mozliwe[i] = BitSet.valueOf(new long[] { (long) (i) });
  190.             gotowe[i] = BitSet.valueOf(new long[] { 0 });
  191.             // println("slowa_mozliwe" + slowa_mozliwe[i]);
  192.             // long longset = bitSetToInt(slowa_mozliwe[i]);
  193.             // String slowa_mozliwe_s = Long.toBinaryString(longset);
  194.  
  195.             // char wgc[] = slowa_mozliwe_s.toCharArray();
  196.  
  197.             for (int j = 0; j < 8; j++) {
  198.  
  199.                 if (slowa_mozliwe[i].get(j) == true)// (BigInteger.valueOf(Long.parseLong(binary,2)).testBit(i))//(wgc[i]=='1')
  200.                 {
  201.                     gotowe[i].xor(bsr[j]);
  202.  
  203.                 }
  204.             }
  205.             // println("bsf"+gotowe[i]);
  206.         }
  207.  
  208.         for (int i = 1; i < (int) java.lang.Math.pow(2, bin_l); i++) {
  209.             int waga = 0;
  210.             for (int j = 0; j < dlugosc_n; j++) {
  211.  
  212.                 if (gotowe[i].get(j) == true) {
  213.                     waga++;
  214.                 }
  215.  
  216.             }
  217.             if (waga < d)
  218.                 d = waga;
  219.         }
  220.         println("waga=" + d);
  221.         l = d - 1;
  222.         t = (int) (l / 2);
  223.         println("t, l: " + t + "," + l);
  224.  
  225.         bsh = new BitSet[dlugosc_n];
  226.  
  227.         for (int i = 0; i < bin_l; i++) {
  228.             bsh[i] = reszta[i];
  229.         }
  230.         int miejsce = (int) java.lang.Math.pow(2,
  231.                 wielomian_generujacy_s.length() - 2);
  232.         for (int i = bin_l; i < dlugosc_n; i++) {
  233.             bsh[i] = BitSet.valueOf(new long[] { miejsce });
  234.             miejsce = miejsce / 2;
  235.         }
  236.         BitSet bshr[] = new BitSet[dlugosc_n];
  237.         for (int i = 0; i < dlugosc_n; i++) {
  238.             bshr[i] = bsh[dlugosc_n - i - 1];
  239.         }
  240.         BitSet syndrom = BitSet.valueOf(new long[] { 0 });
  241.         BitSet nasza_litera = BitSet.valueOf(new long[] { Long.parseLong(
  242.                 stringset, 2) });
  243.  
  244.         for (int i = 0; i < dlugosc_n; i++) {
  245.             // println(bshr[i]);
  246.         }
  247.         for (int i = 0; i < dlugosc_n; i++) {
  248.  
  249.             if (nasza_litera.get(i) == true)// (BigInteger.valueOf(Long.parseLong(binary,2)).testBit(i))//(wgc[i]=='1')
  250.             {
  251.                 syndrom.xor(bshr[i]);
  252.  
  253.             }
  254.  
  255.         }
  256.         char tab_przesunieta[] = new char[dlugosc_n];
  257.         // char tab_pusta[] = new char[dlugosc_n];
  258.         // int przesuniecie = 0;
  259.         char naprawiamy_blad[] = stringset.toCharArray();
  260.         println("syndrom:" + syndrom);
  261.         int ile = 0;// sprawdzamy gdzie mmay blad
  262.         int gdzie = 0;
  263.         for (int i = 0; i < dlugosc_n; i++)
  264.  
  265.         {
  266.             if (syndrom.get(i) == true) {
  267.                 gdzie = dlugosc_n - i - 1;
  268.                 ile++;
  269.             }
  270.         }
  271.         println("bledow mielismy: " + ile);
  272.         println("gdzie: " + gdzie);
  273.         // println("dlugosc stringseta " + stringset.length() + "dlugosc n " +
  274.         // dlugosc_n);
  275.  
  276.         if (ile == t) {
  277.             // char naprawiamy_blad[]= stringset.toCharArray();
  278.             if (naprawiamy_blad[gdzie] == '1') {
  279.                 naprawiamy_blad[gdzie] = '0';
  280.             } else {
  281.                 naprawiamy_blad[gdzie] = '1';
  282.             }
  283.             stringset = new String(naprawiamy_blad);
  284.             println("naprawione cacko:" + stringset);
  285.             String przycietystring = new String(naprawiamy_blad)
  286.                     .substring(0, 8);
  287.             println(przycietystring);
  288.             // println(mapa_ascii.get(przycietystring));
  289.             for (String o : mapa_ascii.keySet()) {
  290.                 if (mapa_ascii.get(o).equals(przycietystring)) {
  291.                     println("odkodowany znaczek to " + o);
  292.                 }
  293.             }
  294.  
  295.         } else if (ile > t && ile <= l) {
  296.             for (int j = 0; j < dlugosc_n; j++) {
  297.                 println("obracanie" + j);
  298.                 println("slowo pierwotne " + stringset);
  299.                 for (int i = 1; i < dlugosc_n; i++) {
  300.  
  301.                     tab_przesunieta[dlugosc_n - 1] = naprawiamy_blad[0];
  302.                     tab_przesunieta[i - 1] = naprawiamy_blad[i];
  303.                 }
  304.                 naprawiamy_blad = tab_przesunieta;
  305.                 // println("tab_przesunieta  "+new String(tab_przesunieta));
  306.                 println("przesuniete      " + new String(naprawiamy_blad));
  307.                 tab_przesunieta = new char[dlugosc_n];
  308.                 nasza_litera = BitSet.valueOf(new long[] { Long.parseLong(
  309.                         new String(naprawiamy_blad), 2) });
  310.                 for (int k = 0; k < dlugosc_n; k++) {
  311.                     // println(bshr[i]);
  312.                 }
  313.                 for (int l = 0; l < dlugosc_n; l++) {
  314.  
  315.                     if (nasza_litera.get(l) == true)// (BigInteger.valueOf(Long.parseLong(binary,2)).testBit(i))//(wgc[i]=='1')
  316.                     {
  317.                         syndrom.xor(bshr[l]);
  318.  
  319.                     }
  320.                 }
  321.                 println("syndrom:" + syndrom);
  322.                 ile = 0;
  323.                 gdzie = 0;
  324.                 // int ile=0;//sprawdzamy gdzie mmay blad
  325.                 // int gdzie=0;
  326.                 for (int m = 0; m < dlugosc_n; m++)
  327.  
  328.                 {
  329.                     if (syndrom.get(m) == true) {
  330.                         gdzie = dlugosc_n - m - 1;
  331.                         ile++;
  332.                     }
  333.                 }
  334.                 println("bledow mielismy: " + ile);
  335.                 println("gdzie: " + gdzie);
  336.                 // println("dlugosc stringseta "+ stringset.length()+
  337.                 // "dlugosc n "+ dlugosc_n);
  338.                 syndrom = BitSet.valueOf(new long[] { 0 });
  339.                 if (ile == t) {
  340.                     println("j - ilosc przesuniec powrotnych" + j);
  341.                     // char naprawiamy_blad[]= stringset.toCharArray();
  342.                     if (naprawiamy_blad[gdzie] == '1') {
  343.                         naprawiamy_blad[gdzie] = '0';
  344.                     } else {
  345.                         naprawiamy_blad[gdzie] = '1';
  346.                     }
  347.                     for (int a = 0; a < j + 1; a++) {
  348.                         for (int i = 1; i < dlugosc_n; i++) {
  349.                             tab_przesunieta[0] = naprawiamy_blad[dlugosc_n - 1];
  350.                             tab_przesunieta[i] = naprawiamy_blad[i - 1];
  351.                         }
  352.                         naprawiamy_blad = tab_przesunieta;
  353.                         tab_przesunieta = new char[dlugosc_n];
  354.                         println(new String(naprawiamy_blad));
  355.                     }
  356.  
  357.                     // stringset = new String(naprawiamy_blad);
  358.                     println("naprawione cacko:" + new String(naprawiamy_blad));
  359.                     String przycietystring = new String(naprawiamy_blad)
  360.                             .substring(0, 8);
  361.                     println(przycietystring);
  362.                     mapa_ascii.get(przycietystring);
  363.                     for (String o : mapa_ascii.keySet()) {
  364.                         if (mapa_ascii.get(o).equals(przycietystring)) {
  365.                             println("odkodowany znaczek to " + o);
  366.                         }
  367.                     }
  368.                     break;
  369.                 }
  370.             }
  371.             // println("blad nienaprawialny");
  372.         } else {
  373.             println("za duzo bledow");
  374.         }
  375.  
  376.     }
  377.  
  378.     public void bledy() {
  379.         println("stringset  bezbledny\n " + stringset);
  380.         int dokad = (stringset.length() - 1);
  381.         println("dokad" + dokad);
  382.         char generator_bledow[] = stringset.toCharArray();
  383.         Random rand = new Random();
  384.         int blad = rand.nextInt((dokad) + 1) + 0; // int blad =
  385.                                                     // rand.nextInt((dokad-bin_l)+1)+bin_l;
  386.         println("blad=" + blad);
  387.         if (generator_bledow[blad] == '1') {
  388.             generator_bledow[blad] = '0';
  389.         } else {
  390.             generator_bledow[blad] = '1';
  391.         }
  392.         stringset = new String(generator_bledow);
  393.         println("blad=" + blad);
  394.         println("stringset z bledem\n " + stringset);
  395.     }
  396.  
  397.     public static long bitSetToInt(BitSet bitSet) // to sluzy to zadmiany z
  398.                                                     // bitseta na inta, fajna
  399.                                                     // sprawa prawda nie?
  400.     {
  401.         long bitInteger = 0;
  402.         for (int i = 0; i < 32; i++)
  403.             if (bitSet.get(i))
  404.                 bitInteger |= (1 << i);
  405.         return bitInteger;
  406.     }
  407.  
  408. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement