0

我在我的 C++ 应用程序中使用 GameKit 进行网络(创建了一个用于管理 GameKit 网络的 Objective-C 类),但问题是 GameKit 使用 NSString(不是 C++ 类型)来识别对等点(peerID)。我已经对 GameKit 进行了很多测试,在我的实践中,peerID 始终是一个数字(例如 754569949)。将 peerID 词法转换为 uint32_t 是否安全?有没有 peerID 不是数字的情况?

4

2 回答 2

0

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

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

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

您可以使用两个std::maps 在两种表示之间快速转换。

只需将 转换为NSString对 C++ 更友好的字符串。或者,先在 Objective-C 中进行翻译并维护索引,然后你可以给你的 C++ 代码一个索引。

于 2013-05-01T22:29:53.203 回答
0

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

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

换句话说,如果您绝对必须使用 int,请提供一种将peerIDs 映射到您的内部标识符的方法。但是保持peerIDs 并与您的标识符相关联,以便能够以另一种方式映射 - 从您的 id 回到NSString.

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

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

如果你需要保证一个特定的peerID总是映射到相同的uint32_t,你要么假设peerID代表一个总是适合的数字uint32_t,要么计算字符串的哈希值。两种方法都存在问题。如此短的哈希在实际使用中可能会发生冲突。另一方面,当 Apple 决定将它们peerID的 s 扩展为也包含字母时,你的系统可能会崩溃。

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

于 2013-05-01T22:44:14.347 回答