From a99f91a0758807b1686f62dddd8d4236769ace22 Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 21 Apr 2017 12:58:11 +1200 Subject: [PATCH 1/2] binary message decoder as well as refactor of xml encoder and decoder placement -added binary message decoder #story[782] --- .../Networking/BinaryMessageDecoder.java | 89 +++++++++++++++++++ .../{ => Networking}/XMLMessageDecoder.java | 2 +- .../{ => Networking}/XMLMessageEncoder.java | 2 +- src/test/java/XMLMessageDecoderTest.java | 4 +- src/test/java/XMLMessageEncoderTest.java | 2 +- 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 src/main/java/seng302/Networking/BinaryMessageDecoder.java rename src/main/java/seng302/{ => Networking}/XMLMessageDecoder.java (99%) rename src/main/java/seng302/{ => Networking}/XMLMessageEncoder.java (98%) diff --git a/src/main/java/seng302/Networking/BinaryMessageDecoder.java b/src/main/java/seng302/Networking/BinaryMessageDecoder.java new file mode 100644 index 00000000..c02b1ec7 --- /dev/null +++ b/src/main/java/seng302/Networking/BinaryMessageDecoder.java @@ -0,0 +1,89 @@ +package seng302.Networking; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * Created by hba56 on 21/04/17. + */ +public class BinaryMessageDecoder { + private byte[] fullMessage; + private byte[] header; + private byte[] message; + private byte[] crc; + + private byte headerSync1; + private byte headerSync2; + private byte headerMessageType; + private byte[] headerTimeStamp; + private byte[] headerSourceID; + private byte[] headerMessageLength; + + + public BinaryMessageDecoder(byte[] fullMessage) { + this.fullMessage = fullMessage; + } + + public void decode() throws IndexOutOfBoundsException{ + //get the header + this.header = Arrays.copyOfRange(this.fullMessage, 0, 16); + + this.headerSync1 = this.header[0]; + this.headerSync2 = this.header[1]; + this.headerMessageType = this.header[2]; + this.headerTimeStamp = Arrays.copyOfRange(this.header, 3, 9); + this.headerSourceID = Arrays.copyOfRange(this.header, 9, 13); + this.headerMessageLength = Arrays.copyOfRange(this.header, 13, 16); + + //get message + this.message = Arrays.copyOfRange(this.fullMessage, 16, this.fullMessage.length - 4); + + //get crc + this.crc = Arrays.copyOfRange(this.fullMessage, this.fullMessage.length - 4, fullMessage.length); + + if (this.message.length != bytesToInt(this.headerMessageLength)){ + System.err.println("message length in header does not equal the message length"); + System.err.println("message length in header: " + bytesToInt(this.headerMessageLength)); + System.err.println("message length: " + this.message.length); + }else if(false){ + //todo check crc + } + } + + private short bytesToShort(byte[] bytesShort){ + ByteBuffer byteBuffer = ByteBuffer.allocate(2); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.put(bytesShort[0]); + byteBuffer.put(bytesShort[1]); + short shortVal = byteBuffer.getShort(0); + return shortVal; + } + + private short bytesToInt(byte[] bytesInt){ + ByteBuffer byteBuffer = ByteBuffer.allocate(4); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.put(bytesInt[0]); + byteBuffer.put(bytesInt[1]); + byteBuffer.put(bytesInt[2]); + byteBuffer.put(bytesInt[3]); + short shortVal = byteBuffer.getShort(0); + return shortVal; + } + + private long bytesToLong(byte[] bytesLong){ + ByteBuffer byteBuffer = ByteBuffer.allocate(8); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.put((byte)0); + byteBuffer.put((byte)0); + byteBuffer.put(bytesLong[0]); + byteBuffer.put(bytesLong[1]); + byteBuffer.put(bytesLong[2]); + byteBuffer.put(bytesLong[3]); + byteBuffer.put(bytesLong[4]); + byteBuffer.put(bytesLong[5]); + long longVal = byteBuffer.getLong(0); + return longVal; + } + +} diff --git a/src/main/java/seng302/XMLMessageDecoder.java b/src/main/java/seng302/Networking/XMLMessageDecoder.java similarity index 99% rename from src/main/java/seng302/XMLMessageDecoder.java rename to src/main/java/seng302/Networking/XMLMessageDecoder.java index 1ff42831..1a5ebd1d 100644 --- a/src/main/java/seng302/XMLMessageDecoder.java +++ b/src/main/java/seng302/Networking/XMLMessageDecoder.java @@ -1,4 +1,4 @@ -package seng302; +package seng302.Networking; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/src/main/java/seng302/XMLMessageEncoder.java b/src/main/java/seng302/Networking/XMLMessageEncoder.java similarity index 98% rename from src/main/java/seng302/XMLMessageEncoder.java rename to src/main/java/seng302/Networking/XMLMessageEncoder.java index 85cd5d2f..0a28a9ce 100644 --- a/src/main/java/seng302/XMLMessageEncoder.java +++ b/src/main/java/seng302/Networking/XMLMessageEncoder.java @@ -1,4 +1,4 @@ -package seng302; +package seng302.Networking; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/src/test/java/XMLMessageDecoderTest.java b/src/test/java/XMLMessageDecoderTest.java index a373db5a..f86b8de4 100644 --- a/src/test/java/XMLMessageDecoderTest.java +++ b/src/test/java/XMLMessageDecoderTest.java @@ -1,7 +1,7 @@ import org.junit.Assert; import org.junit.Test; -import seng302.XMLMessageDecoder; -import seng302.XMLMessageEncoder; +import seng302.Networking.XMLMessageDecoder; +import seng302.Networking.XMLMessageEncoder; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/test/java/XMLMessageEncoderTest.java b/src/test/java/XMLMessageEncoderTest.java index b00c6565..c66729bc 100644 --- a/src/test/java/XMLMessageEncoderTest.java +++ b/src/test/java/XMLMessageEncoderTest.java @@ -1,6 +1,6 @@ import org.junit.Assert; import org.junit.Test; -import seng302.XMLMessageEncoder; +import seng302.Networking.XMLMessageEncoder; import java.io.*; From 655b5787a296296bf25dfddf5f6ccb22ee2f05e9 Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 21 Apr 2017 14:22:47 +1200 Subject: [PATCH 2/2] binary message encoder as well test for the decoder -added binary message encoder -added test for the decoder -bug with the sync number 2 #story[782] --- .../Networking/BinaryMesageEncoder.java | 86 +++++++++++++++++++ .../Networking/BinaryMessageDecoder.java | 28 +++--- src/test/java/BinaryMessageDecoderTest.java | 41 +++++++++ src/test/java/XMLMessageDecoderTest.java | 1 - 4 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 src/main/java/seng302/Networking/BinaryMesageEncoder.java create mode 100644 src/test/java/BinaryMessageDecoderTest.java diff --git a/src/main/java/seng302/Networking/BinaryMesageEncoder.java b/src/main/java/seng302/Networking/BinaryMesageEncoder.java new file mode 100644 index 00000000..0774bec8 --- /dev/null +++ b/src/main/java/seng302/Networking/BinaryMesageEncoder.java @@ -0,0 +1,86 @@ +package seng302.Networking; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * Created by hba56 on 21/04/17. + */ +public class BinaryMesageEncoder { + private byte[] fullMessage; + private byte[] header; + private byte[] message; + private byte[] crc; + + private byte headerSync1 = (byte)0x47; + private byte headerSync2 = (byte)0x83; + private byte headerMessageType; + private long headerTimeStamp; + private int headerSourceID; + private short headerMessageLength; + + public BinaryMesageEncoder(byte headerMessageType, long headerTimeStamp, int headerSourceID, short headerMessageLength, byte[] message){ + //set the header + this.headerMessageType = headerMessageType; + this.headerTimeStamp = headerTimeStamp; + this.headerSourceID = headerSourceID; + this.headerMessageLength = headerMessageLength; + + ByteBuffer tempHeaderByteBuffer = ByteBuffer.allocate(15); + tempHeaderByteBuffer.put(this.headerSync1); + tempHeaderByteBuffer.put(this.headerSync2); + tempHeaderByteBuffer.put(this.headerMessageType); + tempHeaderByteBuffer.put(longToSixBytes(this.headerTimeStamp)); + tempHeaderByteBuffer.put(intToBytes(this.headerSourceID)); + tempHeaderByteBuffer.put(shortToBytes(this.headerMessageLength)); + + + this.header = tempHeaderByteBuffer.array(); + + //set the message + this.message = message; + + //set full message + ByteBuffer tempMessageByteBuffer = ByteBuffer.allocate(19+this.headerMessageLength); + tempMessageByteBuffer.put(this.header); + tempMessageByteBuffer.put(this.message); + + //todo fix crc, currently just some int + tempMessageByteBuffer.put(intToBytes(1)); + this.fullMessage = tempMessageByteBuffer.array(); + + + } + + private short bytesToShort(byte[] bytesShort){ + ByteBuffer byteBuffer = ByteBuffer.allocate(2); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.put(bytesShort[0]); + byteBuffer.put(bytesShort[1]); + short shortVal = byteBuffer.getShort(0); + return shortVal; + } + + private byte[] longToSixBytes(long x) { + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.putLong(x); + return Arrays.copyOfRange(buffer.array(), 2, 8); + } + + private byte[] shortToBytes(short x) { + ByteBuffer buffer = ByteBuffer.allocate(Short.BYTES); + buffer.putShort(x); + return buffer.array(); + } + + private byte[] intToBytes(int x) { + ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES); + buffer.putInt(x); + return buffer.array(); + } + + public byte[] getFullMessage() { + return fullMessage; + } +} diff --git a/src/main/java/seng302/Networking/BinaryMessageDecoder.java b/src/main/java/seng302/Networking/BinaryMessageDecoder.java index c02b1ec7..8d76d1ef 100644 --- a/src/main/java/seng302/Networking/BinaryMessageDecoder.java +++ b/src/main/java/seng302/Networking/BinaryMessageDecoder.java @@ -27,25 +27,30 @@ public class BinaryMessageDecoder { public void decode() throws IndexOutOfBoundsException{ //get the header - this.header = Arrays.copyOfRange(this.fullMessage, 0, 16); + this.header = Arrays.copyOfRange(this.fullMessage, 0, 15); this.headerSync1 = this.header[0]; this.headerSync2 = this.header[1]; this.headerMessageType = this.header[2]; this.headerTimeStamp = Arrays.copyOfRange(this.header, 3, 9); this.headerSourceID = Arrays.copyOfRange(this.header, 9, 13); - this.headerMessageLength = Arrays.copyOfRange(this.header, 13, 16); + this.headerMessageLength = Arrays.copyOfRange(this.header, 13, 15); //get message - this.message = Arrays.copyOfRange(this.fullMessage, 16, this.fullMessage.length - 4); + this.message = Arrays.copyOfRange(this.fullMessage, 15, this.fullMessage.length - 4); //get crc this.crc = Arrays.copyOfRange(this.fullMessage, this.fullMessage.length - 4, fullMessage.length); + //run through the checks if (this.message.length != bytesToInt(this.headerMessageLength)){ System.err.println("message length in header does not equal the message length"); System.err.println("message length in header: " + bytesToInt(this.headerMessageLength)); System.err.println("message length: " + this.message.length); + }else if(this.headerSync1 != 0x47){ + System.err.println("Sync byte 1 is wrong"); + }else if(this.headerSync2 != 0x83){ + System.err.println("Sync byte 2 is wrong"); }else if(false){ //todo check crc } @@ -53,22 +58,21 @@ public class BinaryMessageDecoder { private short bytesToShort(byte[] bytesShort){ ByteBuffer byteBuffer = ByteBuffer.allocate(2); - byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.order(ByteOrder.BIG_ENDIAN); byteBuffer.put(bytesShort[0]); byteBuffer.put(bytesShort[1]); short shortVal = byteBuffer.getShort(0); return shortVal; } - private short bytesToInt(byte[] bytesInt){ + private int bytesToInt(byte[] bytesInt){ ByteBuffer byteBuffer = ByteBuffer.allocate(4); - byteBuffer.order(ByteOrder.LITTLE_ENDIAN); - byteBuffer.put(bytesInt[0]); - byteBuffer.put(bytesInt[1]); - byteBuffer.put(bytesInt[2]); - byteBuffer.put(bytesInt[3]); - short shortVal = byteBuffer.getShort(0); - return shortVal; + byteBuffer.order(ByteOrder.BIG_ENDIAN); + for(int i= 0; i