为什么以下代码会在底部生成日志记录? 这是异常 - 我的第二个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无法显示其信息,但确实如此!
我想要完成什么?好吧,检查我的第一个评论专栏://目的:
当取消注释时,该行会产生警告,即使它确实有效,所以我试图以另一种方式执行此操作,这样我就可以进行干净的编译。如果你看到一个更好的方法来实现这个目标,我会全神贯注。但是请不要纠缠为什么@“\ 000%@ \ 000%@”字符串是必要的,开始接受它。感谢。
答案 0 :(得分:3)
在C(因此是objective-c)中,空字节用于表示字符串的结尾。当您创建字符串对象时,它会获取您提供的所有数据而无需解析,这就是您可以成功将其转换回数据的原因。但是,当您显示字符串时,系统会将字符串读取到第一个空字节,即第一个字节。因此,字符串包含数据,但是任何逐字节读取而不是使用返回长度的字符串的系统函数都会认为它是空的。使用不可显示的字符时,应尽可能多地尝试在字符串对象上使用数据对象。