Anton0093

Lab_5

Oct 24th, 2020
704
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public class Lab6 {
  2.  
  3.     private static final int sizeOfBlock = 6; //размер нашего битового блока
  4.     private static final int sizeOfChar = 1;  //размер одного символа
  5.     private static final int a = 4;
  6.     private static final int b = 2;
  7.     private static final int[][] S_Block1 = {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
  8.                                              {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
  9.                                              {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
  10.                                              {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 10}};
  11.  
  12.     private static String StringToRightLength(String input) {
  13.  
  14.         while (((input.length() * sizeOfChar ) % sizeOfBlock) != 0)
  15.             input += "0";
  16.  
  17.         return input;
  18.     }
  19.  
  20.  
  21.     private static String[] CutStringIntoBlocksEncode(String input) {
  22.  
  23.         String[] Blocks = new String[(input.length() * sizeOfChar)/sizeOfBlock];
  24.  
  25.         int lengthOfBlock = input.length() / Blocks.length;
  26.  
  27.         for (int i = 0; i < Blocks.length; i++) {
  28.  
  29.             Blocks[i] = input.substring(i * lengthOfBlock, lengthOfBlock * (i + 1));
  30.  
  31.         }
  32.             return Blocks;
  33.     }
  34.  
  35.     private static String Right_length(String mystring, int length){
  36.  
  37.         while (mystring.length() != length){
  38.             StringBuilder new_culumn = new StringBuilder(mystring);
  39.             new_culumn.insert(0,"0");
  40.             mystring = new_culumn.toString();
  41.         }
  42.         return mystring;
  43.     }
  44.  
  45.     private static void Decode_SBlock(String[] Blocks){
  46.  
  47.         for (int i = 0; i < Blocks.length; i++) {
  48.  
  49.             String charAt1 = String.valueOf(Blocks[i].charAt(0));
  50.             String charAt2 = String.valueOf(Blocks[i].charAt(1));
  51.  
  52.             //удаляем из блока номер строки в битах(первые два символа)
  53.             StringBuilder sb = new StringBuilder(Blocks[i]);
  54.             sb.delete(0,2);
  55.             Blocks[i] = sb.toString();
  56.  
  57.  
  58.             int row = bin2dec(charAt2.concat(charAt1)); //получаем номер строки в десятичной системе, соединяя первые два символа блока
  59.  
  60.             for (int column = 0; column < 16; column++) {
  61.  
  62.                 if (bin2dec(Blocks[i]) == S_Block1[row][column]) { //ищем в нашей матрице такой же блок
  63.  
  64.                     String rowdec2 = Integer.toBinaryString(row); //получаем номер строки и переводим в двоичный код
  65.                     rowdec2 = Right_length(rowdec2,2); //доводим до нужной длины
  66.  
  67.                     String columndec2 = Integer.toBinaryString(column);//получаем номер столбца и переводим в двоичный код
  68.                     columndec2 = Right_length(columndec2, 4); //доводим до нужной длины
  69.  
  70.                     String charAtnew1 = String.valueOf(rowdec2.charAt(0));
  71.                     String charAtnew2 = String.valueOf(rowdec2.charAt(1));
  72.  
  73.                     Blocks[i] = addChar(columndec2, charAtnew2, b - 1); //добавляем к двоичному коду столбца бит строки
  74.                     Blocks[i] = addChar(Blocks[i], charAtnew1, a - 1); //добавляем к двоичному коду столбца и биту строки еще один бит строки
  75.                 }
  76.             }
  77.         }
  78.         PrintMyBlocks(Blocks);
  79.     }
  80.  
  81.     public static void PrintMyBlocks(String[] blocks){
  82.  
  83.         for (String s : blocks ) {
  84.             System.out.print(s);
  85.         }
  86.         System.out.println("\n");
  87.     }
  88.  
  89.  
  90.     public static String addChar(String str, String ch, int position) {
  91.         StringBuilder sb = new StringBuilder(str);
  92.         sb.insert(position, ch);
  93.         return sb.toString();
  94.     }
  95.  
  96.     private static void Encode_SBlock(String[] Blocks){
  97.  
  98.         String[] Blocks_new = new String[Blocks.length];
  99.  
  100.         for (int i = 0; i < Blocks.length; i++) {
  101.  
  102.             String charAt1 = String.valueOf(Blocks[i].charAt(0));
  103.             String charAt2 = String.valueOf(Blocks[i].charAt(b - 1));
  104.             String charAt3 = String.valueOf(Blocks[i].charAt(2));
  105.             String charAt4 = String.valueOf(Blocks[i].charAt(a - 1));
  106.             String charAt5 = String.valueOf(Blocks[i].charAt(4));
  107.             String charAt6 = String.valueOf(Blocks[i].charAt(5));
  108.  
  109.  
  110.         int row = bin2dec(charAt2.concat(charAt4)); //получаем номер строки, соединяя биты четвертый и второй
  111.  
  112.         int column = bin2dec(((charAt1.concat(charAt3)).concat(charAt5)).concat(charAt6)); //получаем номер столбца, соединяя остальные биты
  113.  
  114.  
  115.         String k = Integer.toBinaryString(row); //переводим номер строки в десятичную систему
  116.  
  117.             k = Right_length(k, 2); //доводим до правильной длины
  118.  
  119.             Blocks_new[i] = Integer.toBinaryString(S_Block1[row][column]); //находим наш блок на пересечении нашей строки и стоблца и переводим его в двоичный
  120.  
  121.             Blocks_new[i] = Right_length(Blocks_new[i], 4);  //доводим до правильной длины
  122.  
  123.             Blocks_new[i] = k.concat(Blocks_new[i]); //соединяем его со строкой
  124.  
  125.     }
  126.         PrintMyBlocks(Blocks_new);
  127.     }
  128.  
  129.     private static void Encode(){
  130.  
  131.         String k = StringToRightLength("0101001010101101101010");
  132.  
  133.         System.out.println("Сообщение:\n" + k);
  134.         System.out.println("\n");
  135.  
  136.         System.out.println("Сообщение после кодировки:");
  137.  
  138.         Encode_SBlock(CutStringIntoBlocksEncode(k));
  139.  
  140.     }
  141.  
  142.     private static void Decode(){
  143.  
  144.         String k = StringToRightLength("111111000000110011000101");
  145.  
  146.         System.out.println("Сообщение после раскодировки: ");
  147.  
  148.         Decode_SBlock(CutStringIntoBlocksEncode(k));
  149.  
  150.     }
  151.  
  152.  
  153.     public static int bin2dec(String binNumber) {
  154.  
  155.         return Integer.parseInt( binNumber, 2);
  156.     }
  157.  
  158.     public static void main(String[] args) {
  159.         Encode();
  160.         Decode();
  161.     }
  162. }
  163.  
RAW Paste Data