package seng302.Networking.MessageDecoders; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; /** * Created by hba56 on 20/04/17. */ public class XMLMessageDecoder { private byte messageVersionNumber; private short ackNumber; private long timeStamp; private byte xmlMsgSubType; private short sequenceNumber; private short xmlMsgLength; private String xmlMessage; private byte[] bytes; public XMLMessageDecoder(byte[] bytes) { this.bytes = bytes; } public void decode() { byte[] ackNumberBytes = Arrays.copyOfRange(bytes, 1, 3); byte[] timeStampBytes = Arrays.copyOfRange(bytes, 3, 9); byte[] sequenceNumberBytes = Arrays.copyOfRange(bytes, 10, 12); byte[] xmlMsgLengthBytes = Arrays.copyOfRange(bytes, 12, 14); byte[] xmlMessagebytes = Arrays.copyOfRange(bytes, 14, bytes.length); this.xmlMsgSubType = bytes[9]; this.messageVersionNumber = bytes[0]; this.ackNumber = bytesToShort(ackNumberBytes); this.timeStamp = bytesToLong(timeStampBytes); this.sequenceNumber = bytesToShort(sequenceNumberBytes); this.xmlMsgLength = bytesToShort(xmlMsgLengthBytes); this.xmlMessage = new String(xmlMessagebytes); } 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 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]); // System.out.println("====decode===="); // for (byte i:byteBuffer.array() // ) { // System.out.println(i); // } // System.out.println("====decode===="); long longVal = byteBuffer.getLong(0); return longVal; } public byte getMessageVersionNumber() { return messageVersionNumber; } public short getAckNumber() { return ackNumber; } public long getTimeStamp() { return timeStamp; } public byte getXmlMsgSubType() { return xmlMsgSubType; } public short getSequenceNumber() { return sequenceNumber; } public short getXmlMsgLength() { return xmlMsgLength; } public String getXmlMessage() { return xmlMessage; } }