Implementation of CustomBinaryStruct Serializer done

This commit is contained in:
Ziver Koc 2016-04-14 13:15:49 +02:00
parent 6071ad7c70
commit e41fe70951
5 changed files with 111 additions and 52 deletions

View file

@ -59,7 +59,7 @@ public class BinaryFieldData {
}
}
protected void setValue(Object obj, byte[] data){
protected void setByteValue(Object obj, byte[] data){
try {
field.setAccessible(true);
if (field.getType() == Boolean.class || field.getType() == boolean.class)
@ -74,8 +74,16 @@ public class BinaryFieldData {
e.printStackTrace();
}
}
protected void setValue(Object obj, Object value){
try {
field.setAccessible(true);
field.set(obj, value);
} catch (IllegalAccessException e){
e.printStackTrace();
}
}
protected byte[] getValue(Object obj){
protected byte[] getByteValue(Object obj){
try {
field.setAccessible(true);
if (field.getType() == Boolean.class || field.getType() == boolean.class)
@ -91,10 +99,22 @@ public class BinaryFieldData {
}
return null;
}
protected Object getValue(Object obj){
try {
field.setAccessible(true);
return field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public int getBitLength(){
return length;
}
public BinaryFieldSerializer getSerializer(){
return serializer;
}
}

View file

@ -25,17 +25,10 @@
package zutil.parser.binary;
import zutil.ByteUtil;
import zutil.converter.Converter;
import zutil.parser.binary.BinaryStruct.BinaryField;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/**
@ -78,23 +71,29 @@ public class BinaryStructInputStream {
int totalReadLength = 0;
for (BinaryFieldData field : structDataList){
byte[] valueData = new byte[(int) Math.ceil(field.getBitLength() / 8.0)];
int fieldReadLength = 0;
// Parse value
for (int valueDataIndex = 0; valueDataIndex < valueData.length; ++valueDataIndex) {
if(dataBitIndex < 0) { // Read new data?
data = (byte) in.read();
dataBitIndex = 7;
}
int bitLength = Math.min(dataBitIndex+1, field.getBitLength() - fieldReadLength);
valueData[valueDataIndex] = ByteUtil.getShiftedBits(data, dataBitIndex, bitLength);
fieldReadLength += bitLength;
dataBitIndex -= bitLength;
if (field.getSerializer() != null){
Object value = field.getSerializer().read(in, field);
field.setValue(struct, value);
}
else {
byte[] valueData = new byte[(int) Math.ceil(field.getBitLength() / 8.0)];
int fieldReadLength = 0;
// Parse value
for (int valueDataIndex = 0; valueDataIndex < valueData.length; ++valueDataIndex) {
if (dataBitIndex < 0) { // Read new data?
data = (byte) in.read();
dataBitIndex = 7;
}
int bitLength = Math.min(dataBitIndex + 1, field.getBitLength() - fieldReadLength);
valueData[valueDataIndex] = ByteUtil.getShiftedBits(data, dataBitIndex, bitLength);
fieldReadLength += bitLength;
dataBitIndex -= bitLength;
}
// Set value
field.setByteValue(struct, valueData);
totalReadLength += fieldReadLength;
}
// Set value
field.setValue(struct, valueData);
totalReadLength += fieldReadLength;
}
return totalReadLength;

View file

@ -73,20 +73,26 @@ public class BinaryStructOutputStream {
List<BinaryFieldData> structDataList = BinaryFieldData.getStructFieldList(struct.getClass());
for (BinaryFieldData field : structDataList){
byte[] data = field.getValue(struct);
if (field.getSerializer() != null){
localFlush();
field.getSerializer().write(out, field.getValue(struct), field);
}
else{
byte[] data = field.getByteValue(struct);
int fieldBitLength = field.getBitLength();
for (int i=(int)Math.ceil(fieldBitLength/8.0)-1; fieldBitLength>0; fieldBitLength-=8, --i) {
byte b = data[i];
if (restBitLength == 0 && fieldBitLength >= 8)
out.write(0xFF & b);
else {
b <<= 8-restBitLength-fieldBitLength;
b &= ByteUtil.getBitMask(7-restBitLength, fieldBitLength);
rest |= b;
restBitLength += fieldBitLength;
if (restBitLength >= 8)
localFlush();
int fieldBitLength = field.getBitLength();
for (int i = (int) Math.ceil(fieldBitLength / 8.0) - 1; fieldBitLength > 0; fieldBitLength -= 8, --i) {
byte b = data[i];
if (restBitLength == 0 && fieldBitLength >= 8)
out.write(0xFF & b);
else {
b <<= 8 - restBitLength - fieldBitLength;
b &= ByteUtil.getBitMask(7 - restBitLength, fieldBitLength);
rest |= b;
restBitLength += fieldBitLength;
if (restBitLength >= 8)
localFlush();
}
}
}
}