如何从uint8_t数组中“删除”数组元素或ge范围?

时间:2014-01-06 16:02:34

标签: ios iphone objective-c arrays uint8t

在我的Iphone应用程序中,我有一个TCP连接,并希望获得正常的数据。

但我需要拆分一个uint8_t数组。

unsigned result;
uint8_t buffer[1024];
len = [inputStream read:buffer maxLength:sizeof(buffer)];
NSString *hexstring = [NSString stringWithFormat:@"%02x%02x%02x%02x",buffer[3],buffer[2],buffer[1],buffer[0]];
                        result = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexstring];
[scanner scanHexInt:&result];
NSLog(@"HexString: %@ Result: %i ",hexstring,result);
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];     

这里我得到前4个字节来获取recived包的长度。

现在我想要一个没有缓冲区[1] - 缓冲区[3]

的缓冲区数组的输出

我的意思是缓冲区[4]到缓冲区[packe长度]的范围。

我如何存档?

2 个答案:

答案 0 :(得分:2)

怎么样:

NSString *output = [[NSString alloc] initWithBytes: buffer + 4 length: len - 4 encoding:NSASCIIStringEncoding];

胜利的指针算法。

此外,通过unsigned int从4个字节获取32位NSString非常迂回(更不用说慢)。为什么不这样做:

uint32_t result = buffer[3] << 24 |  buffer[2] << 16 | buffer[1] << 8 | buffer[0];

我的意思是,即使这是迂回的,但至少它是明确的,并且不假设主机的字节顺序,并且不会通过字符串和NSScanner进行往返。

答案 1 :(得分:1)

我认为这里的基本问题是您使用uint8_t数组。作为一个C数组,你应该有一个非常有说服力的理由在Objective-C中使用它。您在这里没有令人信服的理由,并且已经确定了使用它的原因。

而不是:

uint8_t buffer[1024];

使用NSMutableData构建的dataWithCapacity:。像这样:

NSMutableData *data = [NSMutableData dataWithCapacity:1024];
uint8_t *buffer = [data mutableBytes];

您可以使用针对data

的方法操纵数据

或者,您可以使用memmove(而不是memcopy)直接操作您的数组。不过,我认为这不值得;你通常可以假设Foundation会选择一个好的算法,而你可能会选择最简单的算法,而且你更有可能引入一个块溢出。