NSString в ByteArray и обратно - PullRequest
       20

NSString в ByteArray и обратно

0 голосов
/ 13 января 2010

Я реализую интерфейс, который определяет writeBytes () и readBytes () для файла. Данные должны транспортироваться как JSON.

Для readBytes я делаю следующее: 1. NSFileHandle readDataofLength - читать из файла 2. NSString initWithData: encoding: - для указания заданной кодировки 3. NSString getBytes: буфер 4. поместите каждый буфер [i] в ​​массив JSON для транспорта: [116,101,115,116], например, «test» как UTF-8

С другой стороны, writeBytes должен делать то же самое: 1. Разобрать массив JSON в NSArray 2. NSArray getObjects: buffer - преобразование до этого момента успешно 3. NSString initWithBytes: длина буфера: кодировка: - не работает, возвращаемое значение равно нулю 4. NSData dataUsingEncoding: 5. NSFileHandle writeData

Очевидно, NSString initWithBytes не может обрабатывать буферы с таким содержимым, как [116,101,115,116]. Есть ли другой способ конвертировать NSString в ByteArray и обратно?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 января 2010

Вы проверили, что байты в массиве являются допустимым UTF-8 представлением строки? (http://en.wikipedia.org/wiki/UTF-8)

Если нет, вы получите ноль:

#import <Foundation/Foundation.h>

int
main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    char ary[] = { 116, 101, 115, 116, 255 };

    NSString *s = [[NSString alloc] initWithBytes: ary length: 5 encoding: NSASCIIStringEncoding];
    NSString *s2 = [[NSString alloc] initWithBytes: ary length: 5 encoding: NSUTF8StringEncoding];
    NSLog(@"s: %@, s2: %@", s, s2);

    [pool release];
}

При запуске печатается:

2010-01-13 14:08:23.315 a.out[50653:903] s: testÿ, s2: (null)
0 голосов
/ 13 января 2010

Используете ли вы кодировку NSUnicodeStringEncoding? Если это так, то вам может потребоваться префикс ваших байтов с действительным значением B.O.M (см. ссылка на NSString , раздел " Интерпретация данных в кодировке UTF-16 ").

Вы провели тестирование с помощью NSASCIIStringEncoding, чтобы проверить, работает ли ваш код для простого случая?

...