How do I convert an NSNumber to NSData?

跟風遠走 提交于 2019-12-20 17:34:35

问题


I need to transmit an integer through GameKit using sendDataToAllPeers:withDataMode:error: but I don't know how to convert my NSNumber to NSData in order to send. I currently have:

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

but obviously the indexNum needs to be converted to NSData before I can send it. Does anyone know how to do this please?

Thanks!


回答1:


I would not recommend NSKeyedArchiver for such a simple task, because it adds PLIST overhead on top of it and class versioning.

Pack:

NSUInteger index = <some number>;
NSData *payload = [NSData dataWithBytes:&index length:sizeof(index)];

Send:

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

Unpack (in the GKSession receive handler):

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"



回答2:


To store it:

NSData *numberAsData = [NSKeyedArchiver archivedDataWithRootObject:indexNum];

To convert it back to NSNumber:

NSNumber *indexNum = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsData]; 



回答3:


Why not send the integer directly like this:

NSData * indexData = [NSData dataWithBytes:&index length:sizeof(index)];
[gkSession sendDataToAllPeers:indexData withDataMode:GKSendDataReliable error:nil];



回答4:


For a more detailed example how to send different payloads you can check the GKRocket example included in the XCode documentation.



来源:https://stackoverflow.com/questions/4689689/how-do-i-convert-an-nsnumber-to-nsdata

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!