Hallo,
Na gut denke ich, dann muss ich eben in C printf() benutzen und dann in Java per p.getInputStream() die zwei Byte einlesen:
Java:
Process p = Runtime.getRuntime().exec("./Testprogramm);
byte[] input = new byte[2];
p.getInputStream().read(input);Und in C:
short i = 257;
printf("%d",i);
return 0;Aber nein, dann sind es wiederrum nicht zwei Byte, weil die Ausgabe von printf ja Zeichen für Zeichen als Character gelesen wird und somit kommen dann in Java zwischen 1 Byte und 5 Byte an, je nachdem wie viele Ziffern gerade mein short hat (bei 257 wären es dann 3).
Ach... ;-)
Ok das nervt. Ich habe wirklich keine Lust noch umständlich zu prüfen wie viele Bytes tatsächlich ankamen und dann Zeichen für Zeichen die Daten irgendwie in ein Integer umbasteln.
Das ist in Java recht einfach: Integer.parseInt(meinString);
Zusammen könnte das dann etwa so aussehen:
DataInputStream in = new DataInputStream(p.getInputStream());
String numberAsString = in.readUTF();
int number = Integer.parseInt(numberAsString);
(Ungetester Code!)
Na fein. Einen habe ich noch. Dann zwinge ich eben C dazu wirklich genau zwei Byte auszugeben, die eben genau die Binärdarstellung von meinem short beinhalten, auch wenn es unlesbare Zeichen werden:
short i = 24930;
char *j = (char*)&i;
printf("%c%c", j[1],j[0]);
return 0;Ich habe extra die 24930 gewählt, weil es genau die Zeichen "ab" ergibt.
[..]
Und so habe ich endlich meine Zahl erfolgreich überliefert. Trotzdem ist es ein ziemlicher Hack.
Wie ist das mit der Endianess? Wenn ich nicht gänzlich daneben liege,
dürfte dieses Verfahren bereits dann nicht mehr funktionieren, wenn
du zum Beispiel auf einem PowerPC läufst, weil hier die Byte-Order
auf C-Seite eine andere ist.
Gruß
Slyh