3
NSString *counter = [[NSString alloc] initWithBytes:buffer+1 length:11 encoding:NSUTF8StringEncoding]; //@"003{of}004"
NSString *c1Str = [counter substringToIndex:4];
NSString *c2Str = [counter substringFromIndex:8];

int c1Int = [c1Str intValue];
int c2Int = [c2Str intValue];

NSLog(@"c1Str=%@; c2Str=%@; c1Int=%i; c2Int=%i", c1Str, c2Str, c1Int, c2Int);

//The output is
//c1Str=003; c2Str=004; c1Int=0; c2Int=4

所以我得到 c1Int 的 0(零),而 c2Int 很好。绝对相同的结果是如果我使用:

NSArray *counterValues = [counter componentsSeparatedByString:@"{of}"];
int c1Int = [[counterValues objectAtIndex:0] intValue];
int c2Int = [[[counterValues objectAtIndex:1] intValue];

我从从 NSInputStream 读取的字节缓冲区中获取计数器。将 *counter 直接定义为 @"003{of}004" 可以正常工作。

为什么会这样?*c1Str 中有什么特别之处以至于 intValue 将其视为零?我该如何对抗它?

谢谢

编辑: 这个问题对我来说不再是实际的了。但它可能对其他人有用。我无法按照设定的方式理解和解决我的任务。我不得不重新思考并改变我的工作流程。

我想详细说明问题的根源。我通过网络传输 png 文件并在 ios 上接收数据。这个想法是发送一个从文件中读取的字节数组,并附加前导特殊标签以通知文件即将到来以及计数器是什么。

所以发送的结构如下:[6][003{of}004][文件数据包],其中“[”和“]”括号仅供您理解结构。

正如我提到的,数据来自 NSInputStream,我可以捕获 [6],我可以捕获 [003{of}004],我可以捕获其余数据。NSLog 清楚地显示了它。但是计数器字符串确实很奇怪,我会说字符串开头的东西很奇怪。

首先,是的,如果我尝试通过对它们进行子串化来检索这些部分,那么我必须使用奇怪的索引。

无论我使用什么方法来检索 003 和 004,intValue 都会返回 0,而 004 总是按预期正确处理!

如果有人可以解释为什么会发生这种情况(理想情况下是一个可行的解决方案),那绝对是有用的,非常感谢。

非常感谢所有回复的人。

PS我通过将计数器作为字符串单独发送来解决此问题,并在开头附加了不同的通知标签。因为我现在不需要固定长度的计数器,所以我的值只是数字:3{of}4 或 121{of}784 等(没有前导零)

4

2 回答 2

0

你有错误的输出,如果你的字符串是 @"003{of}004" 你必须使用另一个索引!

NSString *c1Str = [counter substringToIndex:3];
NSString *c2Str = [counter substringFromIndex:7];
于 2012-12-20T12:17:54.243 回答
0

我不知道为什么你的c1Str打印003在日志中。

改变

[counter substringToIndex:4];

[counter substringToIndex:3];

如果你的counter字符串是003{of}004

于 2012-12-20T12:13:26.797 回答