sizeof aus C in Java

Franz Degenhardt

Erfahrenes Mitglied
Hallo,

ich orientiere mich aktuell an C++ Sourcen um ein Java Programm zu schreiben.
Dabei werden des öfteren grosse C-structs verwendet, um mit zu parsenden Daten zu interagieren.

Ich würde gerne einen ähnlichen operator wie sizeof(*dickeStruct) in Java haben.
Oder mit anderen Worten, ich würde gern die Länge des folgenden Objektes herausbekommen ohne gross etwas zu parsen oder manuell jedes Feld beim Namen zu nennen. Hat da wer einen Kniff?

Code:
public class TQSEnv {
	char[] QENV_CRE_NODE_ID = new char[16];
	char[] QENV_CRE_TSP = new char[26];
	char[] QENV_CRE_APP_GRP = new char[16];
	char[] QENV_CRE_APP_ID = new char[16];
	char[] QENV_CRE_TSP_GMT = new char[3];
	char[] QENV_RCD_VERS = new char[2];
	char[] QENV_TQS_TOKEN = new char[50];
	char[] QENV_STS = new char[2];
	char[] QENV_ADD_NODE_ID = new char[16];
	char[] QENV_ADD_APP_GRP = new char[16];
	char[] QENV_ADD_APP_ID = new char[16];
	char[] QENV_USR_TSP = new char[26];
	char[] QENV_USR_VERS = new char[2];
	char[] QENV_USR_TOKEN = new char[50];
	char[] QENV_REP_NODE_ID = new char[16];
	char[] QENV_REP_APP_GRP = new char[16];
	char[] QENV_REP_APP_ID = new char[16];
	char[] QENV_CLS_SRV = new char[2];
	char[] QENV_REQ_PRI = new char[2];
	char[] QENV_QST_ASW = new char[1];
	char[] QENV_RE_SEND = new char[1];
	char[] QENV_DAT_TYP = new char[1];
	char[] QENV_NUM_FMT = new char[1];
	char[] QENV_CDE_PAG = new char[3];
	char[] QENV_DEL_RCD_STS = new char[1];
	char[] QENV_DEL_TYP = new char[1];
	char[] QENV_RCD_LGTH = new char[9];
	char[] QENV_COMP_CDE = new char[1];
	char[] QENV_ENCR_CDE = new char[1];
	char[] QENV_NBR_DAT_RCD = new char[9];
	char[] QENV_SIZE = new char[9];
	char[] QENV_NBR_TRN_BLK = new char[9];
	char[] QENV_NDE_COUNT = new char[2];
	char[] QENV_SND_COUNT = new char[2];
	char[] QENV_REC_NODE_ID = new char[16];
	char[] QENV_REC_TSP = new char[26];
	char[] QENV_REC_TSP_GMT = new char[3];
	char[] QENV_REC_STS = new char[1];
	char[] QENV_REC_RTN_CDE = new char[6];
}
 
Hallo,

schau dir mal JNA (Java Native Access) an:
https://jna.dev.java.net/
Mit JNA kannst du Structs in java Modellieren:
http://stackoverflow.com/questions/494325/jna-struct-and-pointer-mapping
https://jna.dev.java.net/javadoc/overview-summary.html#byvalue

btw. was meinst du genau mit "Länge"? Meinst du wie viele bytes das Objekt ergeben würde wenn man jedes Feld in der Reihenfolge seiner Definition in einen ByteStream schreiben würde?

Sprich:
Java:
public class TQSEnv {
	char[] QENV_CRE_NODE_ID = new char[16];
	char[] QENV_CRE_TSP = new char[26];
	char[] QENV_CRE_APP_GRP = new char[16];
...
16 chars * 2 bytes pro char für QENV_CRE_NODE_ID, danach 16 chars * bytes pro char für QENV_CRE_TSP, 16 char * 2 bytes pro char für QENV_CRE_APP_GRP... etc. ?

Gruß Tom
 
Hi,

mit Länge meinte ich die Anzahl der chars über die ganze Struktur.
In C braucht man einen String nicht in ein solches Objekt zu parsen, man greift einfach mit Pointern aus der struct auf Teile des Strings zu.
Die Tipps mit JNA werde ich mal in Ruhe austesten.
Vorerst habe ich eine Parsingroutine geschrieben, die das Objekt füllt. Ist mühsam und fehleranfällig aber es geht.
 
Hi,

Reflection ist Dein Freund:

Code:
public int sizeOf(Object o) throws IllegalArgumentException, IllegalAccessException {
		int size = 0;
		for(Field field : o.getClass().getDeclaredFields()) {
			Class fieldtype = field.getType();
			// sofern nur char[] möglich, keinerlei weitere Prüfung, ansonsten typenprüfung anbauen
			char[] sub =(char[]) field.get(o);
			size+=sub.length;
		}
       return size;
}
 
Sauber! Mal schauen ob ich meine Parsingroutine gegen den reflection code tausche. In meinen Unittests habe ich sie schon drinn. Geht super.
 
Zurück