我努力自己解决这个问题,但我花了很多时间在这么简单的事情上,所以我希望有人可以给我答案。
看到下面的图片,但基本上我只是试图建立一个范围,但我的标记和我的列表永远不会见面,即使有符合条件的项目。
在下面的例子中我正在寻找2c并且数组将它放在位置11但是正好经过它
我尝试了几种不同的方式,上面的比较工作得很好所以我不知道我的问题所在。 我试着说
== 0x2c
(从不评估)
或像我上面那样使用它
`intValue`
但这使得它在2D上得到了一个匹配,我的测试是因为它将数字截断为简单的2。
实际代码:
int lastIndexInPayload = ([payload count]-1);
int beginningOfData = ([payload count]-1);
NSString * endOfLine = [NSString stringWithFormat:@"%02X", 0x0D];
NSString * startOfLine = [NSString stringWithFormat:@"%02X", 0x2C];
if ([[payload objectAtIndex:lastIndexInPayload]intValue] == [endOfLine intValue]) {
while ([payload objectAtIndex:beginningOfData]!= startOfLine) {
beginningOfData--;
DDLogVerbose(@"beginningOfData %d",beginningOfData);
}
}
有效负载是一个字节数组 取自套接字返回的nsdata
答案 0 :(得分:1)
我想象一下,因为您正在使用==
来比较对象。由于您的数组和startOfLine
对象都只是表示单个字节的十六进制字符串,因此您应该只使用-isEqualToString:
,如
while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine]) {
那就是说,我觉得你的有效载荷是一个十六进制字节数组,表示为字符串。为什么不把整个东西都推到NSData中,并且可以访问"真正的"而不是字节?
答案 1 :(得分:1)
您要根据地址而不是内容来比较字符串,您应该使用while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine])
。另外,为什么要尝试使用字符串作为十六进制值,而不是直接与0xD
进行比较?您对intValue的调用将导致endOfLine为0
,因为它不知道它是十六进制并且将停止尝试解析数字。