在我的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长度]的范围。
我如何存档?
答案 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会选择一个好的算法,而你可能会选择最简单的算法,而且你更有可能引入一个块溢出。