将NSData转换为NSString

时间:2010-01-31 18:45:29

标签: cocoa nsdata

我收到了与服务器的成功连接,我在回调函数中:

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

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地址值,因此它成功获取名称,每个值都是uint8_t .. 对等长度显示我16; 我的问题是将它转换为NSData然后转换为NSString ...

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

我的字符串输出为NULL,

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

3 个答案:

答案 0 :(得分:2)

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

$ man getpeername

...

DESCRIPTION
     The getpeername() function returns the address of the peer connected to
     the specified socket.

你想要getnameinfo():

$ man getnameinfo

...

DESCRIPTION
     The getnameinfo() function is used to convert a sockaddr structure to a
     pair of host name and service strings.  It is a replacement for and pro-
     vides more flexibility than the gethostbyaddr(3) and getservbyport(3)
     functions and is the converse of the getaddrinfo(3) function.

或gethostbyaddr():

$ man gethostbyaddr

...

DESCRIPTION
     The getaddrinfo(3) and getnameinfo(3) functions are preferred over the
     gethostbyname(), gethostbyname2(), and gethostbyaddr() functions.

     The gethostbyname(), gethostbyname2() and gethostbyaddr() functions each
     return a pointer to an object with the following structure describing an
     internet host referenced by name or by address, respectively.

答案 1 :(得分:2)

sockaddr是一个结构,而不仅仅是字符数组的typedef。您需要将getpeername地址传递给实际的sockaddr结构,然后从该结构的sa_data字段构建字符串 - 并且假设sa_data实际上是-[NSString initWithBytes:length:encoding:]您的地址类型的字符串,文档并未建议您可以依赖该字符串。正如另一个答案所说,如果你的目标是获得打印出的字符串表示,那么这不是你想要的电话。

(另外,根本不需要NSData从字符数组转到NSString;你可以只使用{{1}})

答案 2 :(得分:1)

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

如果确实如此,那么最可能的问题是数据不正确的指定编码导致NSString失败编码并返回一个nil字符串。如果是编码问题,NSString上有API用于执行有损编码。即使你的最终解决方案中的损失是不可接受的,走这条路线对于弄清楚出了什么问题也是非常有帮助的。

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