我需要在发送给java服务器的消息的乞讨时输入一个短整数。服务器期望读取短(消息ID)然后读取整数(消息长度)。我在stackoverflow中读到NSMutableData类似于java ByteBuffer。
我正在尝试将消息打包到NSMutableData中然后发送它。
所以这就是我所拥有但不起作用的!。
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);
服务器正在使用Java ByteBuffer读取接收到的数据。所以进来的字节是:
32,120,31,0,2,0
无效。
正确的值,以便ByteBuffer可以将它们读作.getShort()和.getInt()
0,2,0,0,0,-66
答案 0 :(得分:4)
您基本上正确地将内容放入NSData对象,但您没有正确使用send
函数。首先,正如dreamlax建议的那样,使用NSMutableData的-initWithCapacity
初始值设定项来获取容量,而不是归零字节。
您的data
指针是指向Objective-C(NSData)对象的指针,而不是实际的原始字节缓冲区。 send
函数是一个经典的UNIX-y C函数,对Objective-C对象一无所知。它需要一个指向实际字节的指针:
send(sock, [data bytes], [data length], 0);
此外,FWIW,请注意,如果您希望恢复服务器上的多字节字段,那么字节顺序很重要。在将它们放入NSData缓冲区之前,请考虑在short和int值上使用HTONL
和HTONS
,假设服务器期望其数据包格式具有“网络”字节顺序(尽管您可以控制它)。
答案 1 :(得分:1)
我认为你使用dataWithLength:
会给你一个NSMutableData
对象,其中6个字节都被初始化为0,但是你会用实际值追加6个字节(所以你最终得到12个全部字节)。我在这里假设short
是2个字节而int
是4.我相信您想使用dataWithCapacity:
来暗示保留的内存量是多少你打包的数据。
正如quixoto指出的那样,您需要使用bytes
方法,该方法返回指向实际数据的第一个字节的指针。 length
方法将返回您拥有的字节数。
您需要注意的另一件事是字节序。最重要字节的位置取决于底层架构。