Почему эта NSString, созданная из объекта NSData, не показывает, что у нее есть содержимое?

#objective-c #ios #nsstring #nsdata

#objective-c #iOS #nsstring #nsdata

Вопрос:

Почему следующий код создает протоколирование внизу? Вот аномалия — мой второй NSLog должен напечатать chrStr, но ничего не выдает, пустой, что проверяется этой командой отладки:

(gdb) по chrStr

объект возвращает пустое описание

Однако третья NSString, где я повторно конвертирую NSString обратно в объект NSData, отображает данные, то же значение, что и в первом NSLog, как и должно быть. Для меня это указывает на то, что у chrStr должно быть фактическое содержимое. Но, похоже, это не так из NSLOG или команды po. Почему?


 NSString *login;   
NSString *pass;


// Purpose: NSString *loginString = [NSString stringWithFormat:@"00%@00%@", 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:amp;zeroByte length:1];

// append string1, NULL, string2 to data object
[data appendData:subData1];
[data appendBytes:amp;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:

Эта строка при раскомментировании выдает предупреждение, хотя она действительно работает, поэтому я пытался сделать это другим способом, который позволил бы мне выполнить чистую компиляцию. Если вы видите лучший способ достичь этой цели, я весь внимание. Но, пожалуйста, не зацикливайтесь на том, почему это @»00%@00%@» строка необходима, начните с признания того, что она есть. Спасибо.

Ответ №1:

В C (и, следовательно, objective-c) нулевой байт используется для представления конца строки. Когда вы создаете объект string, он принимает все данные, которые вы ему предоставили, без синтаксического анализа, поэтому вы можете успешно преобразовать их обратно в data. Однако, когда вы отображаете строку, система считывает строку до первого нулевого байта, который является первым байтом. Следовательно, строка содержит данные, но любые системные функции, которые читают байт за байтом вместо использования возвращаемой длины строки, будут считать ее пустой. При работе с не отображаемыми символами вам следует стараться использовать объекты данных поверх строковых объектов как можно чаще.