NSString中的其他字符用于网络传输

时间:2011-05-06 09:14:59

标签: objective-c nsstring format

由于Quartz Composer的某些协议规范,字符串“\ 0 \ 0 \ 0”必须在通过UDP发送的每个字符之前。当前值具有以下格式:“1.23456”。对于传输,最后三个小数位不是必需的,而是在每个数字之前添加,所以它应该如下所示:“\ 0 \ 0 \ 01 \ 0 \ 0 \ 0. \ 0 \ 0 \ 02 \ 0 \ 0 \ 03" 。什么是解决这个问题的“Objective-C方式”?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要发送一系列字符(类型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]

答案 1 :(得分:0)

一种变化

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

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

// send the data