From a99f91a0758807b1686f62dddd8d4236769ace22 Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 21 Apr 2017 12:58:11 +1200 Subject: [PATCH] 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.*;