Objective c 为什么从NSData对象创建的NSString无法显示其内容?
为什么下面的代码会在底部生成日志记录? 这是一个异常情况-我的第二个NSLog应该打印CHRST,但不生成任何内容,为空,由以下调试命令验证: (gdb)po chrStr 对象返回空描述 但是,我将NSString重新转换回NSData对象的第三个NSString确实显示了数据,与第一个NSLog中的值相同。这将向我表明chrStr必须具有实际内容。但从NSLOG或po命令来看,情况似乎并非如此。为什么?Objective c 为什么从NSData对象创建的NSString无法显示其内容?,objective-c,ios,nsstring,nsdata,Objective C,Ios,Nsstring,Nsdata,为什么下面的代码会在底部生成日志记录? 这是一个异常情况-我的第二个NSLog应该打印CHRST,但不生成任何内容,为空,由以下调试命令验证: (gdb)po chrStr 对象返回空描述 但是,我将NSString重新转换回NSData对象的第三个NSString确实显示了数据,与第一个NSLog中的值相同。这将向我表明chrStr必须具有实际内容。但从NSLOG或po命令来看,情况似乎并非如此。为什么? 产生: [1071:207]1.NSData:004c6f67 696E661 6D
产生: [1071:207]1.NSData:004c6f67 696E661 6D6500 61737377 6f7264 [1071:207]2.NSString: [1071:207]3.NSDATA:004c6f67 696E661 6D6500 61737377 6f7264
这对我来说真是个谜。如果chrStr为空,则3-NSDATA无法显示其信息,但确实如此 我想要完成什么?好的,检查我的第一行注释://目的: 当未注释时,该行会产生警告,即使它实际上是有效的,所以我尝试用另一种方式来实现它,以使我能够进行干净的编译。如果你能找到更好的方法来实现这个目标,我会全神贯注。但是请不要纠缠于为什么“\000%@\000%@”字符串是必要的,开始接受它是必要的。谢谢。在C(因此也是objective-C)中,空字节用于表示字符串的结尾。当您创建字符串对象时,它会获取您提供给它的所有数据,而无需解析,这就是为什么您可以成功地将其转换回数据。但是,当您显示字符串时,系统将读取字符串,直到第一个空字节,即第一个字节。因此,字符串包含数据,但任何逐字节读取而不是使用返回长度的字符串的系统函数都会认为它是空的。在处理不可显示字符时,应尽可能多地使用数据对象而不是字符串对象
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