如何将NSNumber转换为NSData?

19

我需要使用 sendDataToAllPeers:withDataMode:error: 通过GameKit传输一个整数,但我不知道如何将我的NSNumber转换为NSData以便发送。目前我的代码是:

NSNumber *indexNum = [NSNumber numberWithInt:index];
[gkSession sendDataToAllPeers:indexNum withDataMode:GKSendDataReliable error:nil];

但是显然在发送之前,需要将indexNum转换为NSData格式。有没有人知道如何做到这一点呢?

谢谢!

4个回答

35
我不建议在这样的简单任务中使用NSKeyedArchiver,因为它会增加PLIST开销和类版本控制。
打包:
NSUInteger index = <some number>;
NSData *payload = [NSData dataWithBytes:&index length:sizeof(index)];

发送:

[session sendDataToAllPeers:payload withDataMode:GKSendDataReliable error:nil];

在GKSession接收处理程序中解包:

NSUInteger index;
[payload getBytes:&index length:sizeof(index)];

Swift

var i = 123
let data = NSData(bytes: &i, length: sizeof(i.dynamicType))

var i2 = 0
data.getBytes(&i2, length: sizeof(i2.dynamicType))

print(i2) // "123"

1
在解包时,您假定该数字是NSUInteger。NSNumber可以包装各种不同类型的数字 - int、float、double、signed/unsigned。如果程序员不确定存储在NSNumber中的数据类型,我认为归档和取消归档是最好的方法。我采用Ole的方法。 - Raj Pawan Gumdal
你在哪里使用NSNumber?我从来不用NSNumber。 - user187676
所提出的问题是关于从整数创建NSNumber。因此,我想一个适用于NSNumber的通用解决方案可能更合适。 - Raj Pawan Gumdal
@Erik Aigner:你知道如何用Swift解决这个问题吗?先谢谢了! - Sifeng

22

储存它:

NSData *numberAsData = [NSKeyedArchiver archivedDataWithRootObject:indexNum];

将其转换回NSNumber:

NSNumber *indexNum = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsData]; 

这应该是被接受的答案,因为它不假设数字是整数。 - TTillage
@TTillage 数字不必是整数,我的解决方案仍然有效。你只需要改变类型即可。 - user187676
答案完美地符合问题的标题。然而,@ErikAigner的回答更加针对问题的正文。 - Ayan Sengupta

4
为什么不直接像这样发送整数:
NSData * indexData = [NSData dataWithBytes:&index length:sizeof(index)];
[gkSession sendDataToAllPeers:indexData withDataMode:GKSendDataReliable error:nil];

0

如果您想了解如何发送不同的有效载荷,可以查看XCode文档中包含的GKRocket示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接