如何从数组"remove"元素或 ge 范围uint8_t?



在我的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会选择一个好的算法,而你可能会选择最简单的算法,你更有可能引入区块溢出。

相关内容

  • 没有找到相关文章

最新更新