2013-05-01 76 views
0

我在我的C++应用程序中使用GameKit进行网络连接(创建了一个用于管理GameKit网络的Objective-C类),但问题在于GameKit使用NSString(而不是C++类型) (的peerID)。我已经测试了很多GameKit,并且在我的练习中,peerID始终是一个数字(例如754569949)。将peerID简单地转换为uint32_t安全吗?有没有peerID不是数字的情况?我可以将GameKit的peerID投射到uint32_t

+0

投射会给你在内存中的地址。只需将NSString转换为可以使用的东西?我认为这给你一个char * http://stackoverflow.com/questions/2216266/printing-an-nsstring – 2013-05-01 22:18:31

+0

与演员我的意思是词汇演员(编辑后)。问题是,为了兼容其他代码部分,我需要通过整数标识客户端,而不是字符串 – 2013-05-01 22:24:11

+0

如果问题是'NSString'不是C++类型,那么可以使用'std :: string' – 2013-05-01 22:26:01

回答

0

我看到你的问题的几个部分:1)从peerID字符串解析int; 2)维护内部ID和peerID之间的关联。

如果你需要得到peerID到你的C++代码,然后能够将其转换回NSString用的GameKit框架的使用,你不应该做出peerID的内容比官方文档提供任何更多的假设。

换句话说,如果您绝对必须使用整数,请提供一种将peerID s映射到您的内部标识符的方法。但请保留peerID并与您的标识符相关联,以便能够以其他方式映射 - 从您的ID返回到NSString

制作NSString -> uint32_t的地图可能是一种解决方法。

以上主要介绍了我在第一句中提到的第二部分。现在让我们考虑一下是否保存为将peerID解析为整数。

如果你需要保证一个特定peerID总是映射到相同uint32_t,你要么承担peerID代表一个数字,将始终融入uint32_t,或者你计算字符串的哈希值。这两种方法都存在问题。如此短的散列可能会在实际使用中发生冲突。另一方面,当苹果决定延长其peerID以包括字母时,系统可能会有一天停顿。

所以我不能为你做出决定,我只是试图展示你可能想要考虑的可能性。我强烈建议您找到一种方法来使用原始peerID,可能转换为C++字符串类型。

0

的问题是,与其他代码部分的兼容性,我需要通过整识别客户,不串

如果你要得到一个整数这些字符串,在没有任何保证它将始终是一个数字,只需构建一个已知ID的表并为它们分配索引。

57483829 => 0 
42937422 => 1 
3333fghh => 2 

您就可以使用两个std::map s到快两个之间转换。

只需将NSString转换为更易于使用C++的字符串即可。或者,首先进行翻译并在Objective-C中维护索引,然后可以为C++代码提供索引。