Дополнительные символы в NSString для передачи по сети

#objective-c #nsstring #format

#objective-c #nsstring #формат

Вопрос:

Из-за некоторых спецификаций протокола для Quartz Composer строка » 0 0″ должна предшествовать каждому символу, отправляемому через UDP. Текущее значение имеет следующий формат: «1.23456». Для передачи не требуются последние три знака после запятой, но требуется добавление перед каждым числом, поэтому оно должно выглядеть следующим образом: «1.23». Каков «способ Objective-C» для решения этой проблемы?

Ответ №1:

Если я вас правильно понял, вы хотите отправить последовательность символов (type char ). В этом случае,

 NSString *originalString = @"1.23456";

// It's not clear if you must remove the last three digits
// so I'm assuming that the string always has the last three
// characters removed

NSUInteger stringLength = [originalString length];
if (stringLength > 3)
    originalString = [originalString substringToIndex:stringLength - 3];

// I'm assuming ASCII strings so that one character maps to only one char
const char *originalCString = [originalString cStringUsingEncoding:NSASCIIStringEncoding];

if (! originalCString) {
    NSLog(@"Not an ASCII string");
    exit(1);
}

NSMutableData *dataToSend = [NSMutableData data];
char zeroPadding[] = { 0, 0, 0 };
NSUInteger i = 0;
char character;

while ((character = originalCString[i  ])) {
    [dataToSend appendBytes:zeroPadding length:sizeof zeroPadding];
    [dataToSend appendBytes:amp;character length:1];
}
  

Если вы запустите

 NSLog(@"%@", dataToSend);
  

вывод должен быть

 <00000031 0000002e 00000032 00000033>
  

где

 00000031
  

означает

 00 00 00 31
  

а 31 — это ASCII-код ‘1’ (2e = ‘.’, 32 = ‘2’, 33 = ‘3’).

Если вам нужно знать размер (в байтах) dataToSend , используйте [dataToSend length] . Если вы хотите получить доступ к самим байтам, используйте [dataToSend bytes] .

Ответ №2:

Один вариант

 NSMutableData* dataToSend;
char nullLeader[] = { 0, 0, 0 };

dataToSend = [NSMutableData dataWithBytes: nullLeader length: sizeof nullLeader];
[dataToSend appendData: [myStringIWantToSend dataUsingEncoding: NSUTF8StringEncoding]];

// send the data
  

Комментарии:

1. Предполагается, что myStringIWantToSend содержит только один символ. nullLeader должен, хм, начинаться с каждого символа в строке.

2. Это кажется довольно странным. Вы уверены, что это не просто, что кодировка символов является каким-то 32-разрядным вариантом Unicode?

3. Мне это тоже показалось странным. Но мой быстрый поиск по протоколам Quartz Composer не вернул ничего релевантного.

4. Я получил сетевую часть с этого сайта: arrifana.org/blog/2007/11 /… . Я думаю, что это довольно странно, но я пытаюсь уже два дня, и я рад, что сейчас есть решение.