From 446d5f23062dd965c0b0409819c0d274a570fa79 Mon Sep 17 00:00:00 2001 From: Hubert Tylkowski Date: Wed, 20 Jun 2018 01:06:07 +0200 Subject: [PATCH] decode added! --- Zadanie-03/src/com/tylkowski/crc/CrcTask.java | 61 ++++++++++++++++--- Zadanie-03/src/com/tylkowski/crc/Main.java | 1 + 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/Zadanie-03/src/com/tylkowski/crc/CrcTask.java b/Zadanie-03/src/com/tylkowski/crc/CrcTask.java index 57d2e59..b6c9df4 100644 --- a/Zadanie-03/src/com/tylkowski/crc/CrcTask.java +++ b/Zadanie-03/src/com/tylkowski/crc/CrcTask.java @@ -53,7 +53,7 @@ class CrcTask { } short[] remainder = calcXOR(piece, polyGenerator); remainder = removeUnecessaryZeros(remainder); - createMessageFromRemainderAndPartFromOldMessage(remainder, remainder.length); + messageAsShortArray = createMessageFromRemainderAndPartFromOldMessage(remainder, messageAsShortArray); } @@ -61,12 +61,13 @@ class CrcTask { } - private void createMessageFromRemainderAndPartFromOldMessage(short[] remainder, int length) { - short[] tempArr = new short[remainder.length + messageAsShortArray.length - polyGenerator.length]; - System.arraycopy(remainder, 0, tempArr, 0, length); + private short[] createMessageFromRemainderAndPartFromOldMessage(short[] remainder, short[] msg) { + short[] tempArr = new short[remainder.length + msg.length - polyGenerator.length]; + System.arraycopy(remainder, 0, tempArr, 0, remainder.length); int diff = polyGenerator.length - remainder.length; - System.arraycopy(messageAsShortArray, length + diff, tempArr, length, messageAsShortArray.length - diff - length); - messageAsShortArray = tempArr; + System.arraycopy(msg, remainder.length + diff, tempArr, remainder.length, msg.length - diff - remainder.length); + msg = tempArr; + return msg; } private short[] removeUnecessaryZeros(short[] remainder) { @@ -151,15 +152,57 @@ class CrcTask { polyGenerator[16] = 1; } - private void swapPolynomialValues() { + private short[] swapPolynomialValues(short[] poly) { for (int i = 0; i < polyGenerator.length - 1; i++) { - messageAsShortArray[i] = (short) ((messageAsShortArray[i] + 1) % 2); + poly[i] = (short) ((poly[i] + 1) % 2); } + return poly; } String encode() { convertMessageToBinaryShortArray(); - swapPolynomialValues(); + messageAsShortArray = swapPolynomialValues(messageAsShortArray); return rawMessage + generateFCS(); } + + boolean decode(String encodedString) { + encodedString = fillPolyTo8(encodedString); + short[] encodedShortArray = convertBinaryStringToShortArray(encodedString); + encodedShortArray = swapPolynomialValues(encodedShortArray); + while (true) { + if (shortArrayContains(encodedShortArray, 1)) { + return true; + } + + if (encodedShortArray[0] == 0) { + encodedShortArray = Arrays.copyOfRange(encodedShortArray, 1, encodedShortArray.length); + } else { + short[] piece = Arrays.copyOfRange(encodedShortArray, 0, Math.min(polyGenerator.length, encodedShortArray.length)); + if (piece.length < polyGenerator.length) { + return false; + } + + short[] remainder = calcXOR(piece, polyGenerator); + remainder = removeUnecessaryZeros(remainder); + encodedShortArray = createMessageFromRemainderAndPartFromOldMessage(remainder, encodedShortArray); + } + } + } + + private boolean shortArrayContains(short[] encodedShortArray, int value) { + for (short item : encodedShortArray) { + if (item == value) { + return true; + } + } + return false; + } + + private String fillPolyTo8(String encodedString) { + StringBuilder stringBuilder = new StringBuilder(encodedString); + while (stringBuilder.length() % 8 != 0) { + stringBuilder.insert(0, "0"); + } + return stringBuilder.toString(); + } } diff --git a/Zadanie-03/src/com/tylkowski/crc/Main.java b/Zadanie-03/src/com/tylkowski/crc/Main.java index 3cc07b8..77f226e 100644 --- a/Zadanie-03/src/com/tylkowski/crc/Main.java +++ b/Zadanie-03/src/com/tylkowski/crc/Main.java @@ -5,6 +5,7 @@ public class Main { public static void main(String[] args) { CrcTask crcTask = new CrcTask(toBinary(args[0]), args[0]); System.out.println(crcTask.encode()); + System.out.println(crcTask.decode(toBinary(crcTask.encode()))); } private static String toBinary(String s) {