【问题标题】:Why does this NSString created from an NSData object fail to show it has contents?为什么从 NSData 对象创建的这个 NSString 无法显示它有内容?
【发布时间】:2011-08-19 15:01:42
【问题描述】:

为什么下面的代码会在底部生成日志? 这是异常情况——我的第二个 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%@" 字符串是必要的,开始接受它。谢谢。

【问题讨论】:

    标签: objective-c ios nsstring nsdata


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多