0

在我的 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] 到缓冲区 [packe 长度] 的范围。

我怎样才能存档呢?

4

2 回答 2

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.

于 2014-01-06T16:23:13.023 回答
1

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

而不是这个:

uint8_t buffer[1024];

使用NSMutableData内置的dataWithCapacity:. 像这样的东西:

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

然后,您可以使用针对data.

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

于 2014-01-06T18:10:09.537 回答