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