Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NSMutableData的Objective-C包装数据?_Objective C - Fatal编程技术网

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

使用NSMutableData的Objective-C包装数据?,objective-c,Objective C,我需要在向java服务器发送消息时输入一个简短的整数。服务器希望先读取一个短消息(消息id),然后读取一个整数(消息长度)。我在stackoverflow中读到NSMutableData类似于java ByteBuffer 我正在尝试将消息打包到NSMutableData中,然后发送它 这就是我所拥有的,但不起作用 NSMutableData *data = [NSMutableData dataWithLength:(sizeof(short) + sizeof(int))]; short

我需要在向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()


您基本上正确地将内容放入NSData对象中,但没有正确地将其与
send
函数一起使用。首先,正如dreamlax所建议的,使用NSMutableData的
-initWithCapacity
初始值设定项获取容量,而不是零字节

您的
数据
指针是指向Objective-C(NSData)对象的指针,而不是实际原始字节缓冲区的指针。
send
函数是一个经典的UNIX-y C函数,它对Objective-C对象一无所知。它需要一个指向实际字节的指针:

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

另外,FWIW,请注意,如果希望恢复服务器上的多字节字段,endianness在这里很重要。考虑在将短消息和int值放在NStaseBasic缓冲区之前,使用“代码> HtnL和<代码> HTONS <代码>,假设服务器希望其数据包格式的“网络”字节顺序(虽然可能您控制了)。

< P>基本上正确地将数据放入NStATATE对象中,但是您没有正确地将其与
发送功能一起使用。首先,正如dreamlax所建议的,使用NSMutableData的
-initWithCapacity
初始值设定项获取容量,而不是零字节

您的
数据
指针是指向Objective-C(NSData)对象的指针,而不是实际原始字节缓冲区的指针。
send
函数是一个经典的UNIX-y C函数,它对Objective-C对象一无所知。它需要一个指向实际字节的指针:

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

另外,FWIW,请注意,如果希望恢复服务器上的多字节字段,endianness在这里很重要。在将其放入NStaseBasic缓冲区之前,请考虑使用“代码> HtNLL < /COD>和<代码> HTONS <代码>,假设服务器希望其包格式具有“网络”字节顺序(尽管您可能控制它).

我认为您使用
dataWithLength:
将为您提供一个
NSMutableData
对象,其中6个字节全部初始化为0,但随后您将再添加6个字节和实际值(因此您最终将得到12个字节)。这里我假设
short
是2个字节,
int
是4个字节。我相信您希望使用
dataWithCapacity:
来提示要为正在打包的数据保留多少内存

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


你需要注意的另一件事是持久性。最重要字节的位置取决于基础架构。

我认为使用
dataWithLength:
将为您提供一个
NSMutableData
对象,其中6个字节都初始化为0,但随后您会再添加6个字节和实际值(因此,最终会得到12个字节)。这里我假设
short
是2个字节,
int
是4个字节。我相信您希望使用
dataWithCapacity:
来提示要为正在打包的数据保留多少内存

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


你需要注意的另一件事是持久性。最高有效字节的位置取决于底层架构。

+1,但我认为他没有正确地将数据放入NSData对象,因为他使用的是
dataWithLength:
,而不是
dataWithCapacity:
。谢谢您和dreamlax。我使用了[data bytes]和dataWithCapacity。实际上,我在服务器端得到的字节是2,0,-58,0,0,0。字节的顺序相反。在发送之前,我如何解决此问题。我不想改变我的服务器,它与其他JavaCSCI一起工作得很好。任何建议再次感谢我使用了HTONS(msg_id)和HTONL(length)。字节的顺序是正确的。+1,但我认为他没有正确地将数据放入NSData对象,因为他使用的是
dataWithLength:
,而不是
dataWithCapacity:
。谢谢您,感谢dreamlax。我使用了[data bytes]和dataWithCapacity。实际上,我在服务器端得到的字节是2,0,-58,0,0,0。字节的顺序相反。在发送之前,我如何解决此问题。我不想改变我的服务器,它与其他JavaCSCI一起工作得很好。任何建议再次感谢我使用了HTONS(msg_id)和HTONL(length)。字节的顺序是正确的。