-added binary message decoder #story[782]main
parent
54a2c08258
commit
a99f91a075
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package seng302;
|
package seng302.Networking;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package seng302;
|
package seng302.Networking;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
Loading…
Reference in new issue