在我的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 个字节来获取接收包的长度。
现在我想要缓冲区范围的输出 没有缓冲区的数组[1] - 缓冲区[3]
我的意思是从缓冲区[4]到缓冲区[包的长度]的范围。
如何存档?
怎么样:
NSString *output = [[NSString alloc] initWithBytes: buffer + 4 length: len - 4 encoding:NSASCIIStringEncoding];
获胜的指针算术。
此外,通过NSString
从 4 个字节获取 32 位unsigned int
是非常迂回的(更不用说慢了)。为什么不这样做:
uint32_t result = buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
我的意思是,即使这是迂回的,但至少它是明确的,并且不假设主机的字节序,并且不会通过字符串和NSScanner
来回旅行。
我认为这里的基本问题是你对uint8_t
数组的使用。作为一个C数组,你应该有一个非常令人信服的理由在Objective-C中使用它。在这里,您没有令人信服的理由,并且已经确定了不使用它的理由。
取而代之的是:
uint8_t buffer[1024];
使用dataWithCapacity:
构建的NSMutableData
。像这样:
NSMutableData *data = [NSMutableData dataWithCapacity:1024];
uint8_t *buffer = [data mutableBytes];
然后,您可以使用针对data
的方法操作数据。
或者,您可以使用memmove
(而不是memcopy
)直接操作数组。不过,我认为这不值得;你通常可以假设Foundation会选择一个好的算法,而你可能会选择最简单的算法,你更有可能引入区块溢出。