Дополнительные символы в NSString для передачи по сети
Из-за некоторых спецификаций протокола для Quartz Composer строка "\ 0 \ 0 \ 0" должна предшествовать каждому символу, отправляемому через UDP. Текущее значение имеет следующий формат: "1.23456". Для перевода последние три знака после запятой не обязательны, кроме добавления перед каждым числом, поэтому оно должно выглядеть так: "\0\0\01\0\0\0.\0\0\02\0\0\03". Что это за способ Objective-C, чтобы решить эту проблему?
2 ответа
Если я вас правильно понял, вы хотите отправить последовательность символов (введите 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]
,
Один вариант
NSMutableData* dataToSend;
char nullLeader[] = { 0, 0, 0 };
dataToSend = [NSMutableData dataWithBytes: nullLeader length: sizeof nullLeader];
[dataToSend appendData: [myStringIWantToSend dataUsingEncoding: NSUTF8StringEncoding]];
// send the data