【问题标题】:Convert NSData to NSString将 NSData 转换为 NSString
【发布时间】:2010-01-31 18:45:28
【问题描述】:

我正在接收到服务器的成功连接,并且我在我的回调函数中:

我正在尝试获取主机的名称并将其打印到我的控制台:

if(theType == kCFSocketConnectCallBack){
        NSLog(@"Connection is accepted");
        CFSocketNativeHandle nativeSocket = CFSocketGetNative(theSocket);
        uint8_t name[SOCK_MAXADDRLEN];
        socklen_t namelen = sizeof(name);
        NSData *peer = nil;
        if (getpeername(nativeSocket, (struct sockaddr *)name, &namelen) == 0) {
            peer = [NSData dataWithBytes:name length:namelen];
            NSString *string = [[NSString alloc] initWithData:peer encoding:NSUTF8StringEncoding];
            NSLog(@"IP adress of connected peer: %@", string);
        } 

当我在调试模式下运行应用程序时,我可以看到分配给 name 的 IP 地址值,因此它成功获取 name ,每个值都是 uint8_t.. 对等长度显示我 16; 我的问题是将其转换为 NSData 然后 NSString...

输出: 2010-01-31 13:57:58.671 已连接对等方的 IP 地址:(null)

我的字符串被输出为 NULL,

感谢任何建议,谢谢....

【问题讨论】:

  • 你有没有找到有用的东西?

标签: cocoa nsdata


【解决方案1】:

getpeername() 不返回远程端的主机名;它返回地址:

$ 人 getpeername ... 描述 getpeername() 函数返回连接的对等体的地址 指定的套接字。

你想要getnameinfo():

$ 人获取名称信息 ... 描述 getnameinfo() 函数用于将 sockaddr 结构转换为 一对主机名和服务字符串。它是一个替代品和亲 比 gethostbyaddr(3) 和 getservbyport(3) 更灵活 函数,是 getaddrinfo(3) 函数的逆函数。

或 gethostbyaddr():

$ man gethostbyaddr ... 描述 getaddrinfo(3) 和 getnameinfo(3) 函数优先于 gethostbyname()、gethostbyname2() 和 gethostbyaddr() 函数。 gethostbyname()、gethostbyname2() 和 gethostbyaddr() 函数各 返回指向具有以下结构的对象的指针,该结构描述 分别按名称或地址引用的 Internet 主机。

【讨论】:

  • 感谢您的澄清,但是我得到了正确的信息,但我无法将 peer(NSData) 转换为 NSString 然后输出值....
  • 您无法打印它,因为您正在尝试使用非 c 字符串数据创建 NSString*。如果您想打印它,那么您正在使用的电话并没有为您提供“正确的信息”。
【解决方案2】:

sockaddr 是一个结构,而不仅仅是字符数组的 typedef。您需要将getpeername 地址传递给实际的sockaddr 结构,然后从该结构的sa_data 字段构建字符串——假设sa_data 实际上是您的地址类型的字符串,即该文档并不建议您实际上可以依靠。正如另一个答案所说,如果您的目标是打印出字符串表示,这不是您想要的调用。

(另外,你根本不需要 NSData 来从字符数组到 NSString;你可以使用 -[NSString initWithBytes:length:encoding:]

【讨论】:

    【解决方案3】:

    首先,检查以确保 peer 包含长度非零的 NSData 实例。

    如果是这样,那么最可能的问题是数据不正确地采用指定的编码,导致 NSString 编码失败并返回一个 nil 字符串。如果是编码问题,NSString 上有用于进行有损编码的 API。即使有损在您的最终解决方案中是不可接受的,但走这条路线对于找出问题所在非常有帮助。

    假设NULL 你真的是指nil。粘贴日志行的确切输出会很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2012-11-09
      • 2011-11-11
      相关资源
      最近更新 更多