为什么从NSData对象创建的NSString不能显示其内容?

5
为什么以下代码会产生底部的日志记录? 这里有一个反常现象 - 我的第二个NSLog应该打印chrStr,但是什么也没有输出,空白,这通过以下调试命令得到了验证:
(gdb) po chrStr 对象返回空描述
然而,我重新将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

输出结果:

[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无法显示其信息,但它确实可以显示!

我想要达到什么目的?请检查我的第一条注释行:// purpose:

即使它实际上可以工作,但是当取消注释时,该行会产生警告,因此我试图以另一种方式完成它,以便我可以进行干净的编译。如果您看到更好的实现目标的方法,请告诉我。但是请不要纠结于为什么那个@"\000%@\000%@"字符串是必要的,开始接受它的存在。谢谢。

1个回答

3
在C语言(因此也包括Objective-C),使用空字节来表示字符串的结尾。当您创建字符串对象时,它会接受您给出的所有数据而不进行解析,这就是为什么您可以成功地将其转换回数据的原因。然而,当您显示字符串时,系统会读取字符串直到第一个空字节(即第一个字节)。因此,该字符串包含数据,但任何以逐字节方式读取而不使用字符串返回的长度的系统函数都会认为它为空。当您使用不可显示字符时,请尽可能经常使用数据对象而不是字符串对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接