我在我的 C++ 应用程序中使用 GameKit 进行网络(创建了一个用于管理 GameKit 网络的 Objective-C 类),但问题是 GameKit 使用 NSString(不是 C++ 类型)来识别对等点(peerID)。我已经对 GameKit 进行了很多测试,在我的实践中,peerID 始终是一个数字(例如 754569949)。将 peerID 词法转换为 uint32_t 是否安全?有没有 peerID 不是数字的情况?
2 回答
问题是为了与代码的其他部分兼容,我需要通过整数而不是字符串来识别客户端
如果您必须从这些字符串中获取一个整数,在没有任何保证的情况下它始终是一个数字,只需构建一个已知 ID 的表并为它们分配索引。
57483829 => 0
42937422 => 1
3333fghh => 2
您可以使用两个std::map
s 在两种表示之间快速转换。
只需将 转换为NSString
对 C++ 更友好的字符串。或者,先在 Objective-C 中进行翻译并维护索引,然后你可以给你的 C++ 代码一个索引。
我看到你的问题有几个部分:1)从peerID
字符串中解析一个int;2) 维护您的内部 id 和peerID
s 之间的关联。
如果您需要peerID
进入您的 C++ 代码,然后能够将其转换回用于 GameKit 框架,您不应该对's 的内容做出任何比官方文档提供的NSString
更多的假设。peerID
换句话说,如果您绝对必须使用 int,请提供一种将peerID
s 映射到您的内部标识符的方法。但是保持peerID
s 并与您的标识符相关联,以便能够以另一种方式映射 - 从您的 id 回到NSString
.
制作地图NSString -> uint32_t
可能是解决问题的一种方法。
以上主要涵盖了我在第一句话中提到的第二部分。现在让我们考虑是否保存解析peerID
为整数。
如果你需要保证一个特定的peerID
总是映射到相同的uint32_t
,你要么假设peerID
代表一个总是适合的数字uint32_t
,要么计算字符串的哈希值。两种方法都存在问题。如此短的哈希在实际使用中可能会发生冲突。另一方面,当 Apple 决定将它们peerID
的 s 扩展为也包含字母时,你的系统可能会崩溃。
所以我真的不能为你做决定,我只是试图列出你可能想要考虑的可能性。我强烈建议您找到一种使用 original 的方法peerID
,可能转换为 C++ 字符串类型。