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