Hallo!
ich versuche schon seit geraumer zeit einen TCP/IP socket in c zu
erstellen der einfach einen unsigned char mit write wegsendet und dieser
dann mit einem java client empfangen wird.
Das funktioniert auch alles sehr gut bis auf wenn ich einen unsigned
char größer 127 wegsenden will kommt mir immer auf der java seite die
Zahl 253 heraus. also für alle werte größer 7 bit ein konstanter wert :(
der c seitige code:
* Converts a char array into a unsinged short array
76
* @param input
77
* @return
78
*/
79
privateshort[]unsignedconverter(char[]input)
80
{
81
short[]result=newshort[input.length];
82
83
intfirstByte=0;
84
85
for(inti=0;i<input.length;i++)
86
{
87
firstByte=(0x000000FF&((int)input[i]));
88
result[i]=(short)firstByte;
89
}
90
91
92
returnresult;
93
}
ich glaube eher das der fehler sich irgendwo auf der c seite befindet...
kann ja sein das ein normales write() hier den unsigned char in einen
singed umwandelt... jedoch wäre das dann nicht die erklärung für den
immer konstanten wert von 253
bitte um hilfe danke :)
Hallo!
Derzeit habe ich ein ähnliches Projekt vor mir. Ich schreibe einen
SocketServer in Java und muss mit C-Clients umgehen können.
Im "Java Kochbuch" von O'Reilly befindet sich ein hinweis, dass man auf
C-Seite Network-Byte-Order-Macros verwenden sollte. Zur Datenübertragung
gibt es da wohl Makros in den Internet Header Dateien oder in
<machine/endian.h>
Auf Java-Seite lässt sich das ganze dann mittels DataInputStream lesen.
Als Beispiel hat der Autor eine C-Implementierung angegeben, die die
entsprechenden Makros verwendet und eine Datei mit zufälligen Werten
füllt. Der Code kann aber auch für Netzwerksockets verwendet werden.
http://javacook.darwinsys.com/javasrc/io/WriteRandom.c
Viele Grüße
Stefan
Sagt mal, hat hier irgend eine (Schul-)Klasse dies als Hausaufgabe
bekommen?? Es sind jetzt schon deren drei...
@BUBU
schau doch mal unter Beitrag "Daten per C++ an Java-Programm: Java-Typenproblem?" ( Daten
per C++ an Java-Programm: Java-Typenproblem? )
Grüße
Markus V.
Es ist zwar schon ne Weile her, dass ich in Java Netzwerkprogramme
geschrieben habe (und selbst da ging nur Klartext übers Netz), aber sind
Reader/Writer wirklich sinnvoll? Wenn ich mich recht entsinne waren die
eher für Klartext denn für Binärdaten gedacht. Wie gesagt, schon ewig
her, bin ein wenig aus der Übung...
Hallo!
Ich bin mir nicht sicher, ob meine Antwort dir weiterhelfen wird, aber
es könnte daran liegen, dass Java einfach keine 'unsigned' Typen kennt.
Möchte man dennoch unsigned Typen verwenden, so kann man sich ja mal
diesen Workaround anschauen, der mir bei der Problematik auch schon mal
die Augen geöffnet hat:
>http://darksleep.com/player/JavaAndUnsignedTypes.html <.
Wie gesagt, ich weiß nicht so recht, ob ich dein Problem überhaupt
richtig verstanden habe, aber dieses 'unsigned'-Problem bei Java hat
mich halt aufhorchen lassen.
Gruß
Maik
Habs noch mal nachgelesen, Reader/Writer ist wirklich für Texte gedacht,
darum auch beim BufferedWriter das newLine(), das immer den für die
Plattform richtigen Zeilenvorschub generiert :)
Wenn man ein Problem mit signed/unsigned hat, dann bekommt man im
Fehlerfall eine Differenz zwischen richtigem und falschem Wert, die
einer Zweierpotenz entspricht (2^8, 2^16, 2^32 oder 2^64, je nach Länge
des Integers), Stichwort "Zweierkomplement". Der beschriebene Fehler
(mehrere Zeichen werden auf eine bestimmte Zahl abgebildet) sieht eher
so aus, als habe der Reader versucht, die Zeichen als Text zu
interpretieren und verschiedene Zeichen als "unbekannt" gelesen
(vielleicht weil sie nicht im 7-bit-Standard-ASCII drin sind). Habe
leider gerade kein JDK hier installiert, um das schnell zu testen...
Wäre schön, wenn BUBU mal schreiben könnte, obs inzwischen läuft, was
ihm dabei geholfen hat, und falls es nicht läuft, wie das Problem
inzwischen aussieht.