使用NSMutableData的Objective-C打包数据?

时间:2010-11-20 00:50:03

标签: objective-c

我需要在发送给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

2 个答案:

答案 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值上使用HTONLHTONS,假设服务器期望其数据包格式具有“网络”字节顺序(尽管您可以控制它)。

答案 1 :(得分:1)

我认为你使用dataWithLength:会给你一个NSMutableData对象,其中6个字节都被初始化为0,但是你会用实际值追加6个字节(所以你最终得到12个全部字节)。我在这里假设short是2个字节而int是4.我相信您想使用dataWithCapacity:来暗示保留的内存量是多少你打包的数据。

正如quixoto指出的那样,您需要使用bytes方法,该方法返回指向实际数据的第一个字节的指针。 length方法将返回您拥有的字节数。

您需要注意的另一件事是字节序。最重要字节的位置取决于底层架构。