2014-02-07 3 views
1

Мне нужно добавить символ в строку как проверку crc. Строка состоит из 125 символов. 125-й символ - это символ crc.Кодировка символов Ascii и UTF8

Я петлю по 124 первым символам, добавляя их значения ascii вместе, выполняя некоторые бит-вещи с суммой и вычисляя значение ascii для последнего символа (125-й символ).

Значение ascii может быть> 127 и < = 255. Мне нужно получить строковое представление для этого значения (иногда называемого расширенным символом ascii).

Я попытался это:

NSString *s1 = [NSString stringWithFormat:@"%C", 155] 

но печать s1 в отладчик шоу @ "". Я ожидал бы, что s1 будет @ "ø".

Что-то подсказывает мне, что я должен использовать UTF8, но как бы я это сделал?

+0

Разве вы не используете '% c' вместо этого? –

+0

- это отладчик, способный отображать расширенные символы ascii? – TMacGyver

+0

Почему вы ожидали, что 155 будет «ø»? Какая кодировка символов должна быть? –

ответ

0

Вместо этого использовать NSString *s1 = [NSString stringWithFormat:@"%c", 155];. Спецификатор «% c» даст вам 8-битный символ, а «% C» даст вам 16-битный символ.

+0

Привет. Это не работает. S1 заканчивается равным пустой строке. – Torben

+0

Thats странно. Когда я печатаю s1 следующим образом: NSLog (@ "% @", s1); Я получаю «õ» в качестве вывода ... – Atomix

+0

short: int s1 = 155; NSString * s11 = [NSString stringWithFormat: @ "% C", s1]; NSString * s111 = [NSString stringWithFormat: @ "% C", (unichar) s1]; NSLog (@ "% @", s11); NSLog (@ "% @", s111); дает знак вопроса перевернутый символ! – Torben

0

Может быть, попробовать что-то вдоль этих линий

int i = 155; 
NSData *data = [NSData dataWithBytes: &i length: sizeof(i)]; 

NSLog(@"val: %@", [[NSString alloc] initWithData:data 
             encoding:NSASCIIStringEncoding]); 

или NSUTF8StringEncoding

+0

Не UTF8. Символ контрольной суммы недействителен UTF8. –

+0

И, скорее всего, не NSASCIIStringEncoding, это строгая 7-битная кодировка. –

0

Контрольная сумма байт означает, эти данные на самом деле не является допустимой строкой кодировки, и вы, вероятно, есть и другие проблемы, если вы пытаетесь представить это как NSString. Вместо этого вы должны использовать NSData.

+0

Привет, Грег. Не могли бы вы быть более конкретными и, может быть, показать пример? – Torben

0

Это работает:

int checksum = 200; 
    NSString *str2 = [[NSString alloc] initWithBytes: &checksum 
              length: 1 
              encoding: NSISOLatin1StringEncoding]; 
    NSString *str1 = @"abc"; 
    NSString *str = [str1 stringByAppendingString: str2]; 


checksum int 200 200 
str2 __NSCFString   * @"È" 0x00000001001105a0 
str1 __NSCFConstantString * @"abc" 0x0000000100002980 
str  __NSCFString   * @"abcÈ" 0x00000001001109f0 

Как упомянуто 'ASCII' кодирования строго 7 бит.

Если вы делаете то же, что и выше, но с '155', символ не будет отображаться. Но он есть:

(lldb) call [str characterAtIndex: 0] 
(unsigned short) $0 = 97 
(lldb) call [str characterAtIndex: 1] 
(unsigned short) $1 = 98 
(lldb) call [str characterAtIndex: 2] 
(unsigned short) $2 = 99 
(lldb) call [str characterAtIndex: 3] 
(unsigned short) $3 = 155 
+0

Привет. Ну, это работает, если контрольная сумма равна 200, но нет, если она равна 155. Не могли бы вы объяснить? – Torben

+0

извините. Я не видел последнего комментария от отладчика. Я просто не понимаю, почему я вижу персонажа (200), а не (155), поскольку они оба больше, чем 127. – Torben

+0

Я не думаю, что вам все равно. Когда вы добавили «контрольную сумму», это уже не «строка» - это настраиваемая структура данных вашего собственного дизайна. Вы выбираете использовать «строгую вещь» в качестве своей структуры данных; но это не «строка». – GoZoner

Смежные вопросы