2011-09-29 80 views
0

我努力去解決這個問題,但我花了很多時間在這麼簡單的事情上,所以我希望有人能給我答案。 看到下面的圖像,但基本上我只是試圖建立一個範圍,但我的標記和我的列表永遠不會見,即使有符合標準的項目。
在下面的示例中,我正在尋找2c,並且該數組在11的位置上,但剛好超過它。
enter image description here十六進制不正確評估

我已經嘗試了幾種不同的方式,而且它上面的比較工作得很好,所以我不明白在我的問題。 我已經嘗試只是說

== 0x2c(從不計算)

或使用該就像我上面

`intValue` 

但是這使它獲得二維,從我的測試是一個比賽,因爲它截斷數字下降到只有普通的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

請發佈實際的代碼,而不僅僅是它的圖片。調試器的圖片有幫助,但它可以幫助我們複製/更正/粘貼實際的代碼。 –

回答

1

我想這是因爲你使用==比較對象服用。因爲它似乎都陣列,並且您的startOfLine對象是代表一個字節,僅十六進制的字符串,你應該只使用-isEqualToString:,如

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

這麼說,我覺得很奇怪,你的有效載荷是一個數組十六進制字節表示爲字符串爲什麼不把整個事情推到一個NSData中,而是可以訪問「真正的」字節呢?

+0

@owengerig:在這種情況下兩個字符串相等的兩個對象不一定是相同的對象指針。如果你使用'char *',你會遇到同樣的問題。 'strcmp()'所說的兩個'char *'是相同的,可能是單獨指向包含相同內容的單獨內存塊的指針。作爲一般規則,除非你真的真的想知道它是否是完全相同的對象(而不僅僅是相等),否則'=='在Obj-C對象上是無用的。 –

+0

謝謝。我一直在努力做到這一點,因爲我在某個時間點迷路了。但我想這是因爲我有一個對象(從索引對象返回),並試圖查看它是否等於字符串對象。這就是爲什麼我冒險intValue,stringValue和喜歡。 –

1

您正在比較字符串的地址而不是其內容,您應該使用while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine])。另外你爲什麼要嘗試使用十六進制值的字符串,而不是直接與0xD進行比較?您對intValue的調用將導致0 for endOfLine,因爲它不知道它是十六進制,並且將停止嘗試解析數字。

+0

當我把0x2c vs startofline我得到一個糟糕的執行錯誤。你可以從我的其他條件陳述中看到我做到了這一點,並且工作。我標記了這一點,因爲它確實回答了爲什麼(地址,而不是內容)這是有點什麼我想,但無法掌握 –

+0

我會認爲這是因爲0x2c不是一個字符串其數字 –