Почему эта NSString, созданная из объекта NSData, не может показать, что у него есть содержимое? - PullRequest
5 голосов
/ 05 мая 2011

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

(gdb) po chrStr

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

Однако третья строка NSString, в которой я повторно преобразовываю строку NSString обратно в объект NSData, отображает данные, то же значение, что и в первом 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% @" необходима, начните с того, что принимаете ее. Спасибо.

1 Ответ

3 голосов
/ 05 мая 2011

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

...