2010-11-20 5 views
1

Ich muss eine Kurz- und Ganzzahl am Anfang einer Nachricht setzen, die ich an einen Java-Server sende. Der Server erwartet eine kurze (Nachrichten-ID) und dann eine Ganzzahl (Nachrichtenlänge). Ich habe im Stackoverflow gelesen, dass NSMutableData java ByteBuffer ähnlich ist.Objective-C Packdaten mit NSMutableData?

Ich versuche, die Nachricht in NSMutableData zu packen und dann zu senden.

Also das ist was ich habe aber nicht funktioniert!.

NSMutableData *data = [NSMutableData dataWithLength:(sizeof(short) + sizeof(int))]; 

short msg_id = 2; 
int length = 198; 

[data appendBytes:&msg_id length:sizeof(short)]; 
[data appendBytes:&length length:sizeof(int)]; 

send(sock, data, 6, 0); 

Der Server verwendet Java ByteBuffer, um die empfangenen Daten einzulesen. So kommen die Bytes in ist:

32,120,31,0,2,0 

, die ungültig ist.

Der richtige Wert, so dass die ByteBuffer können sie als .getShort() und .getInt lesen()

0,2,0,0,0,-66 

Antwort

4

Sie sind im Grunde Sachen in das NSData Objekt setzen richtig, aber Sie verwenden sie nicht mit Die send funktioniert korrekt. Zunächst einmal, wie dreamlax vorschlägt, benutze NSMutableDatas -initWithCapacity Initialisierer, um eine Kapazität zu erhalten, nicht nullte Bytes.

Ihr data Zeiger ist ein Zeiger auf ein Objective-C (NSData) -Objekt, nicht der eigentliche Raw-Byte-Puffer. Die send-Funktion ist eine klassische UNIX-y C-Funktion und weiß nichts über Objective-C-Objekte. Er erwartet einen Zeiger auf die tatsächlichen Bytes:

send(sock, [data bytes], [data length], 0); 

Auch FWIW, beachten Sie, dass endianness Angelegenheiten hier, wenn Sie die Multibyte-Felder auf dem Server erholen erwartest. Ziehen Sie die Verwendung von HTONL und HTONS für die Werte short und int in Betracht, bevor Sie sie in den NSData-Puffer setzen, vorausgesetzt, der Server erwartet die Bytefolge "network" für sein Paketformat (obwohl Sie dies möglicherweise steuern).

+1

+1, aber ich glaube nicht, dass er die Daten richtig in das NSData-Objekt richtig einfügt, weil er 'dataWithLength:' statt 'dataWithCapacity:' verwendet. – dreamlax

+0

Vielen Dank und Danke an dreamlax. Ich habe [Datenbytes] und die DataWithCapacity verwendet. Ich bekomme tatsächlich die Bytes auf der Serverseite als 2,0, -58,0,0,0. Die Bytes sind in umgekehrter Reihenfolge. Wie kann ich das beheben, bevor ich es sende? Ich will meinen Server nicht ändern, es funktioniert gut mit anderen Java CSCI. jede Empfehlung – Unis

+0

Danke nochmal ich habe HTONS (msg_id) und HTONL (Länge) benutzt. Die Bytes kommen in der richtigen Reihenfolge. – Unis

1

Ich denke, Ihre Verwendung von dataWithLength: gibt Ihnen ein NSMutableData Objekt mit 6 Bytes alle auf 0 initialisiert, aber dann fügen Sie 6 weitere Bytes mit tatsächlichen Werten (so dass Sie am Ende mit 12 Bytes alle oben). Ich nehme an, dass short ist 2 Bytes und int ist 4. Ich glaube, Sie möchten dataWithCapacity: verwenden, um anzugeben, wie viel Speicher für Ihre Daten reservieren, die Sie packen.

Wie quixoto aufgezeigt hat, müssen Sie die bytes Methode verwenden, die einen Zeiger auf das erste Byte der tatsächlichen Daten zurückgibt. Die length Methode gibt die Anzahl der Bytes zurück, die Sie haben.

Eine andere Sache, auf die Sie achten müssen, ist Endianness. Die Position des höchstwertigen Bytes hängt von der zugrundeliegenden Architektur ab.

Verwandte Themen