Дополнительные символы в NSString для передачи по сети - PullRequest
0 голосов
/ 06 мая 2011

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

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Если я вас правильно понял, вы хотите отправить последовательность символов (введите 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:&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].

0 голосов
/ 06 мая 2011

Один вариант

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

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

// send the data
...