Hmm... För mig så låter det här som ett encoding/decoding-problem...
Du vet hur structarna ser ut, eller hur? Du vet vad som är gemensamt i alla structar.
Om du skickar datat till ett javaprogram som läser in det, utan att tolka det i en buffert så är det efter det bara att börja koda av det...
antag att du har två structar, A och B som ser ut såhär:
struct A {
int type;
int len;
char[] data;
B* bStruct;
A* nextA;
}
och
struct B {
int type;
int alfa;
int beta;
int omega;
}
Då kan du skapa en basklass som ser ut något såhär:
import java.nio.ByteBuffer;
public abstract class Element {
protected ByteBuffer buff;
public Element(ByteBuffer b)
{
this.buff = b;
}
public abstract void decode();
}
och dessa subklasar du en för varje struct:
import java.nio.ByteBuffer;
public class AElement extends Element {
int len;
byte[] data;
BElement bStruct;
AElement nextA;
public AElement(ByteBuffer b) {
super(b);
}
/*
* (non-Javadoc)
*
* @see Element#decode()
*/
public void decode() {
len = buff.getInt();
data = new byte[len];
buff.get(data, 0, data.length);
bStruct = (BElement) ElementFactory.getElement(buff);
if(bStruct != null)
bStruct.decode();
nextA = (AElement) ElementFactory.getElement(buff);
if(nextA != null)
nextA.decode();
}
public static final int typeCode = 1;
}
import java.nio.ByteBuffer;
public class BElement extends Element {
int alfa;
int beta;
int omega;
public BElement(ByteBuffer b) {
super(b);
}
/*
* (non-Javadoc)
*
* @see Element#decode()
*/
public void decode() {
alfa = buff.getInt();
beta = buff.getInt();
omega = buff.getInt();
}
public static final int typeCode = 2;
}
Jag brukar vilja skapa själva Elementen ur en fabrik så jag skrev ihop en ElementFactory.
import java.nio.ByteBuffer;
public class ElementFactory {
public static Element getElement(ByteBuffer buff)
{
Element result = null;
int type = buff.getInt(); // The type is first in every buffer
switch (type) {
case AElement.typeCode:
result = new AElement(buff);
break;
case BElement.typeCode:
result = new BElement(buff);
break;
default:
break;
}
return result;
}
}
Notera att detta är principkod. Jag har dock andra applikationer som simulerar protokoll som använder samma principer.
Hoppas det hjälper lite.