Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.18 KB | None | 0 0
  1. package com.company;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Random;
  5. import java.util.Scanner;
  6.  
  7. import static java.lang.Math.abs;
  8.  
  9. public class Main {
  10.  
  11.     public static void main(String[] args) {
  12.  
  13.         Main main = new Main();
  14.         Random random = new Random();
  15.         Scanner scanner = new Scanner(System.in);
  16.  
  17.         // Данные варианта
  18.         byte[] register = {0, 0, 0, 0, 0};
  19.         byte[] polynomial = {1, 1, 0, 1, 0, 1};
  20.         byte[] myMessage = {1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0};
  21.  
  22.         // Выбор опции
  23.         String option = "";
  24.         while (!option.equals("1") && !option.equals("2") && !option.equals("3")) {
  25.             System.out.print("Случайная последовательность (1)/ Данные варианта (2)/ Пример из методички (3): ");
  26.             option = scanner.next();
  27.         }
  28.  
  29.         switch (option) {
  30.             // Случайная последовательность
  31.             case "1":
  32.                 System.out.print("Введите длину последовательности (целое положительное число): ");
  33.                 byte[] randomMessage = new byte[scanner.nextInt() + register.length];
  34.                 // Генерация случайной последовательности
  35.                 for (int i = 0; i < randomMessage.length - register.length; i++) {
  36.                     randomMessage[i] = (byte) (abs(random.nextInt()) % 2);
  37.                 }
  38.                 // Добавление нулей в конец
  39.                 for (int j = randomMessage.length - register.length; j < randomMessage.length; j++) {
  40.                     randomMessage[j] = 0;
  41.                 }
  42.                 System.out.println("Последовательность: " + Arrays.toString(randomMessage));
  43.                 // Вычисление CRC
  44.                 register = main.getCRC(randomMessage, register, polynomial);
  45.                 System.out.println("CRC = " + Arrays.toString(register));
  46.                 // Проверка CRC
  47.                 System.out.println("Проверка: " + Arrays.toString(main.checkCRC(randomMessage, register, polynomial, main)));
  48.                 break;
  49.             case "2": // Данные варианта
  50.                 // Вычисление CRC
  51.                 register = main.getCRC(myMessage, register, polynomial);
  52.                 System.out.println("CRC = " + Arrays.toString(register));
  53.                 // Проверка CRC
  54.                 System.out.println("Проверка: " + Arrays.toString(main.checkCRC(myMessage, register, polynomial, main)));
  55.                 break;
  56.             case "3":
  57.                 // Значения из примера в методичке
  58.                 byte[] testMessage = {1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0};
  59.                 byte[] testRegister = {0, 0, 0, 0};
  60.                 byte[] testPolynomial = {1, 0, 0, 1, 1};
  61.                 // Вычисление CRC
  62.                 testRegister = main.getCRC(testMessage, testRegister, testPolynomial);
  63.                 System.out.println("CRC = " + Arrays.toString(testRegister));
  64.                 // Проверка CRC
  65.                 System.out.println("Проверка: " + Arrays.toString(main.checkCRC(testMessage, testRegister, testPolynomial, main)));
  66.                 break;
  67.         }
  68.     }
  69.  
  70.     // Вычисление CRC
  71.     private byte[] getCRC(byte[] message, byte[] register, byte[] polynomial) {
  72.         // Обход всего сообщения (эквивалент "Пока остались не обработанные биты")
  73.         for (byte aMessage : message) {
  74.             // Запись выдвигаемого бита
  75.             byte pushedBit = register[0];
  76.             // Сдвиг регистра влево
  77.             for (int j = 1; j < register.length; j++) {
  78.                 register[j - 1] = register[j];
  79.             }
  80.             // Запись справа в регистр следующего бита сообщения
  81.             register[register.length - 1] = aMessage;
  82.             if (pushedBit == 1) {
  83.                 for (int i = 0; i < register.length; i++) {
  84.                     // Сложение по модулю 2 соответствующих битов регистра и полинома
  85.                     register[i] = (byte) (register[i] ^ polynomial[i + 1]);
  86.                 }
  87.             }
  88.             System.out.println(Arrays.toString(register));
  89.         }
  90.  
  91.         // Готовый CRC
  92.         return register;
  93.     }
  94.  
  95.     private byte[] checkCRC(byte[] message, byte[] register, byte[] polynomial, Main main) {
  96.         // Запись CRC в конец последовательности
  97.         for (int i = 0; i < register.length; i++) {
  98.             message[i + message.length - register.length] = register[i];
  99.         }
  100.         // Очистка регистра
  101.         for (int i = 0; i < register.length; i++) {
  102.             register[i] = 0;
  103.         }
  104.  
  105.         // Проверка правильности CRC
  106.         return main.getCRC(message, register, polynomial);
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement