为什么从NSData对象创建的NSString无法显示它有内容?

Ric*_*Ric 5 objective-c nsstring nsdata ios

为什么以下代码在底部生成日志记录?这是异常 - 我的第二个NSLog应该打印chrStr但不产生任何空白,这由此debug命令验证:

(gdb)po chrStr

object返回空描述

但是,我将NSString重新转换回NSData对象的第三个NSString显示数据,与第一个NSLog中的值相同,应该如此.这将向我表明chrStr必须具有实际内容.但是从NSLOG或po命令看来似乎并非如此.为什么?


NSString *login;   
NSString *pass;


// Purpose: NSString *loginString = [NSString stringWithFormat:@"\000%@\000%@", login, pass];    
login = @"Loginname";       // text string1
pass = @"Password";         // text string2

// convert text strings to data objects
NSData *subData1 = [login dataUsingEncoding:NSUTF8StringEncoding];  
NSData *subData2 = [pass dataUsingEncoding:NSUTF8StringEncoding];   

// embed a NULL into new NSData object
NSMutableData *data = [NSMutableData data];
unsigned char zeroByte = 0;
[data appendBytes:&zeroByte length:1];

// append string1, NULL, string2 to data object
[data appendData:subData1];
[data appendBytes:&zeroByte length:1];
[data appendData:subData2];
NSLog(@"1.NSData:  %@", data);                  // print data object

// create a character string from data object
NSString *chrStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"2.NSString:  %@", chrStr);              // print character string

// create data object from string object
NSData *chrData = [chrStr dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"3.NSDATA:  %@", chrData);               // print data object
Run Code Online (Sandbox Code Playgroud)

产品:[1071:207] 1.NSData:004c6f67 696e6e61 6d650050 61737377 6f7264

[1071:207] 2.NSString:

[1071:207] 3.NSDATA:004c6f67 696e6e61 6d650050 61737377 6f7264


这对我来说真的很神秘.如果chrStr为空,则3-NSDATA无法显示其信息,但确实如此!

我想要完成什么?好吧,检查我的第一条评论专栏://目的:

当取消注释时,该行会产生警告,即使它实际上有效,所以我试图以另一种方式执行此操作,这使我能够进行干净的编译.如果你看到一个更好的方法来实现这个目标,我会全神贯注.但是请不要纠缠为什么@"\ 000%@\000%@"字符串是必要的,开始接受它.谢谢.

ugh*_*fhw 3

在 C(以及 Objective-C)中,空字节用于表示字符串的结尾。当您创建字符串对象时,它会获取您提供给它的所有数据而不进行解析,这就是您可以成功将其转换回数据的原因。但是,当您显示字符串时,系统会读取字符串直至第一个空字节,即第一个字节。因此,该字符串包含数据,但任何逐字节读取而不是使用字符串返回长度的系统函数都会认为它是空的。当您使用不可显示的字符时,您应该尝试尽可能多地使用数据对象而不是字符串对象。