我可以将GameKit的peerID转换为uint32_t

时间:2013-05-01 22:14:31

标签: c++ objective-c gamekit uint32

我在我的C ++应用程序中使用GameKit进行网络连接(创建了一个用于管理GameKit网络的Objective-C类),但问题是GameKit使用NSString(不是C ++类型)来识别对等体(peerID)。我已经测试了很多GameKit,在我的练习中,peerID总是一个数字(例如754569949)。词汇表将peerID强制转换为uint32_t是否安全?是否存在peerID不是数字的情况?

2 个答案:

答案 0 :(得分:0)

  

问题是,为了与代码的其他部分兼容,我需要通过整数来识别客户端,而不是字符串

如果必须从这些字符串中获取一个整数,在没有任何保证的情况下它将始终是一个数字,只需构建一个已知ID的表并为它们分配索引。

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

您可以使用两个std::map来快速转换两种表示形式。

只需将NSString转换为更符合C ++标准的字符串即可。或者,首先在Objective-C中进行转换和维护索引,然后为C ++代码提供索引。

答案 1 :(得分:0)

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

如果您需要将peerID放入C ++代码中,然后将其转换回NSString以便与GameKit框架一起使用,则不应再对{{1}做出任何假设}官方文档提供的内容。

换句话说,如果您必须使用整数,请提供一种将peerID映射到内部标识符的方法。但请保持peerID周围并与您的标识符相关联,以便能够以另一种方式进行映射 - 从您的ID返回peerID

制作NSString地图可能是一种方法。

以上大部分内容涵盖了我在第一句中提到的第二部分。现在让我们考虑是否将NSString -> uint32_t解析为整数。

如果您需要保证特定peerID始终映射到同一peerID,您可以假设uint32_t代表一个始终符合peerID的数字,或者你计算字符串的哈希值。两种方法都存在问题。这样的短哈希可能在实际使用中发生冲突。另一方面,当Apple决定将uint32_t扩展为包括字母时,您的系统可能会制造一天。

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