十六进制未正确评估

时间:2011-09-29 18:43:04

标签: objective-c

我努力自己解决这个问题,但我花了很多时间在这么简单的事情上,所以我希望有人可以给我答案。 看到下面的图片,但基本上我只是试图建立一个范围,但我的标记和我的列表永远不会见面,即使有符合条件的项目。
在下面的例子中我正在寻找2c并且数组将它放在位置11但是正好经过它 enter image description here

我尝试了几种不同的方式,上面的比较工作得很好所以我不知道我的问题所在。 我试着说

== 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

2 个答案:

答案 0 :(得分:1)

我想象一下,因为您正在使用==来比较对象。由于您的数组和startOfLine对象都只是表示单个字节的十六进制字符串,因此您应该只使用-isEqualToString:,如

while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine]) {

那就是说,我觉得你的有效载荷是一个十六进制字节数组,表示为字符串。为什么不把整个东西都推到NSData中,并且可以访问"真正的"而不是字节?

答案 1 :(得分:1)

您要根据地址而不是内容来比较字符串,您应该使用while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine])。另外,为什么要尝试使用字符串作为十六进制值,而不是直接与0xD进行比较?您对intValue的调用将导致endOfLine为0,因为它不知道它是十六进制并且将停止尝试解析数字。