forked from kalmar/DALGLI0
decode added!
This commit is contained in:
parent
84c7c81153
commit
446d5f2306
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user