NSString от NSData със знака: fl

Как мога да се върна обратно към NSString от байтовата дата на NSString, съдържаща този знак: fl ?

NSString *inflatedString01  = @"fl";

// original code that was the problem!
NSData *dataOfString = [NSData dataWithBytes:[inflatedString01 UTF8String] length:[inflatedString length]];
// code that fixes the problem
//NSData *dataOfString = [inflatedString01 dataUsingEncoding:NSUTF8StringEncoding]; //thanks zneak

NSLog(@"%@",inflatedString01);
NSLog(@"%i",[inflatedString01 length]);
NSLog(@"%@",dataOfString);
NSLog(@"%i",[dataOfString length]);

NSString *stringFromData = [NSString stringWithCString:[dataOfString bytes] encoding:NSUTF8StringEncoding]

NSLog(@"%@",stringFromData);

Резултатът от горното дава:

2012-01-02 08:47:48.963 TestApp[74363:fe03] fl
2012-01-02 08:47:49.262 TestApp[74363:fe03] 1
2012-01-02 08:47:49.540 TestApp[74363:fe03] <ef>
2012-01-02 08:47:49.924 TestApp[74363:fe03] 1
2012-01-02 08:47:50.787 TestApp[74363:fe03] (null)

Бих искал да видя fl вместо (null) за последния изход на NSLog. Предполагам, че има значение с изхода "ef" на NSData.


person Vamos    schedule 02.01.2012    source източник
comment
Всъщност мисля, че го разбрах, опитах: NSData *dataOfString = [NSData dataWithBytes:[inflatedString01 UTF8String] length:strlen([inflatedString01 UTF8String])]; който получи правилната дължина на низовите байт данни (мисля!)   -  person Vamos    schedule 02.01.2012


Отговори (1)


Проблемът е несъответствието на размера на символа спрямо двоичния размер. Когато извикате [NSString length], това, което получавате, е броят на логическите знаци в низа, а не броят байтове, необходими за съхраняването му в произволно кодиране. Символът fl е един логически знак за класа NSString, но неговото UTF-8 кодиране е ef ac 82: заема 3 байта.

Вашето извикване към [NSData dataWithBytes:length:] получава указател към тези 3 байта, но след това [inflatedString01 length] казва, че това е само един знак и вие го предавате като брой байтове; ето защо вашите данни съдържат само ef.

strlen, без да е наясно с кодирането, просто ще преброи броя на байтовете в C низ, докато намери нула, така че ще върне точно броя на байтовете в UTF-8 низ (както отбелязахте в коментара си).

Най-доброто решение вероятно би било просто да извикате [inflatedString01 dataUsingEncoding:NSUTF8StringEncoding], за да получите байтовете.

person zneak    schedule 02.01.2012
comment
Благодаря за обяснението, sneak, ще приема след 5 минути :-) - person Vamos; 02.01.2012
comment
@Rew, няма проблем :) също обмислете използването на -[NSString dataUsingEncoding:] за получаване на байтовете. - person zneak; 02.01.2012
comment
Разбира се, ще актуализирам въпроса за другите, попадна там поради опита ми от всичко и всичко (винаги помага да разберете какво правите :-) ) - person Vamos; 02.01.2012
comment
Предполагам имахте предвид +[NSString stringWithCString:encoding:]; както и да е, благодаря за помощта! - person Vamos; 02.01.2012
comment
@Rew, както Mac OS, така и iOS имат -[NSString dataUsingEncoding:] метод. - person zneak; 02.01.2012