Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.util.Arrays;
- import java.util.Random;
- import java.util.Scanner;
- import static java.lang.Math.abs;
- public class Main {
- public static void main(String[] args) {
- Main main = new Main();
- Random random = new Random();
- Scanner scanner = new Scanner(System.in);
- // Данные варианта
- byte[] register = {0, 0, 0, 0, 0};
- byte[] polynomial = {1, 1, 0, 1, 0, 1};
- byte[] myMessage = {1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0};
- // Выбор опции
- String option = "";
- while (!option.equals("1") && !option.equals("2") && !option.equals("3")) {
- System.out.print("Случайная последовательность (1)/ Данные варианта (2)/ Пример из методички (3): ");
- option = scanner.next();
- }
- switch (option) {
- // Случайная последовательность
- case "1":
- System.out.print("Введите длину последовательности (целое положительное число): ");
- byte[] randomMessage = new byte[scanner.nextInt() + register.length];
- // Генерация случайной последовательности
- for (int i = 0; i < randomMessage.length - register.length; i++) {
- randomMessage[i] = (byte) (abs(random.nextInt()) % 2);
- }
- // Добавление нулей в конец
- for (int j = randomMessage.length - register.length; j < randomMessage.length; j++) {
- randomMessage[j] = 0;
- }
- System.out.println("Последовательность: " + Arrays.toString(randomMessage));
- // Вычисление CRC
- register = main.getCRC(randomMessage, register, polynomial);
- System.out.println("CRC = " + Arrays.toString(register));
- // Проверка CRC
- System.out.println("Проверка: " + Arrays.toString(main.checkCRC(randomMessage, register, polynomial, main)));
- break;
- case "2": // Данные варианта
- // Вычисление CRC
- register = main.getCRC(myMessage, register, polynomial);
- System.out.println("CRC = " + Arrays.toString(register));
- // Проверка CRC
- System.out.println("Проверка: " + Arrays.toString(main.checkCRC(myMessage, register, polynomial, main)));
- break;
- case "3":
- // Значения из примера в методичке
- byte[] testMessage = {1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0};
- byte[] testRegister = {0, 0, 0, 0};
- byte[] testPolynomial = {1, 0, 0, 1, 1};
- // Вычисление CRC
- testRegister = main.getCRC(testMessage, testRegister, testPolynomial);
- System.out.println("CRC = " + Arrays.toString(testRegister));
- // Проверка CRC
- System.out.println("Проверка: " + Arrays.toString(main.checkCRC(testMessage, testRegister, testPolynomial, main)));
- break;
- }
- }
- // Вычисление CRC
- private byte[] getCRC(byte[] message, byte[] register, byte[] polynomial) {
- // Обход всего сообщения (эквивалент "Пока остались не обработанные биты")
- for (byte aMessage : message) {
- // Запись выдвигаемого бита
- byte pushedBit = register[0];
- // Сдвиг регистра влево
- for (int j = 1; j < register.length; j++) {
- register[j - 1] = register[j];
- }
- // Запись справа в регистр следующего бита сообщения
- register[register.length - 1] = aMessage;
- if (pushedBit == 1) {
- for (int i = 0; i < register.length; i++) {
- // Сложение по модулю 2 соответствующих битов регистра и полинома
- register[i] = (byte) (register[i] ^ polynomial[i + 1]);
- }
- }
- System.out.println(Arrays.toString(register));
- }
- // Готовый CRC
- return register;
- }
- private byte[] checkCRC(byte[] message, byte[] register, byte[] polynomial, Main main) {
- // Запись CRC в конец последовательности
- for (int i = 0; i < register.length; i++) {
- message[i + message.length - register.length] = register[i];
- }
- // Очистка регистра
- for (int i = 0; i < register.length; i++) {
- register[i] = 0;
- }
- // Проверка правильности CRC
- return main.getCRC(message, register, polynomial);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement