2016-06-15 45 views
1

我有一個C++向量充滿了來自TCP數據段的uint8_t值。我正在專門尋找應該在矢量的第一個索引處的兩個值中的一個值。將8位無符號整數與HEX失敗進行比較

我有以下if語句來表達我的邏輯。

if (ui8BufferIn.at(0) != 0xE4 || ui8BufferIn.at(0) != 0xE2){ 
    printf("\nWe have a problem, no parsing will be done, Package Type = %u\n", ui8BufferIn.at(0)); 
    proceed = false; 
} 

上面的if語句在執行時不應該執行。我碰到下面的打印輸出:

We have a problem, no parsing will be done, Package Type = 226 

所以,你不必做數學題,226爲整數是十六進制0xE2

我一直在這一段時間,所以它可能很簡單,但任何幫助將是偉大的!

+3

我懷疑你想&&而不是||。事實上,你的狀況總是評估爲真。 – nephtes

回答

3

我想你可能希望你的邏輯是:

if (ui8BufferIn.at(0) != 0xE4 && ui8BufferIn.at(0) != 0xE2){ 

由於現在你說「如果這兩種情況下:(這不是0xE4)或情況:(這不是0xE2),我們有一個問題「 - 如果我理解正確,這不是你想說的。隨着你的陳述,你可能會得到0xE2,但因爲你沒有得到0xE4ui8BufferIn.at(0) != 0xE4),你的陳述就會執行。

+1

我覺得很蠢。就是這樣,謝謝! – btald1331

+0

沒問題,我們都有那些日子。 :P –

2

你的代碼有一個小的邏輯錯誤。在這種情況下,您的錯誤將始終顯示。假設uint8_t的值爲0xE2。您將獲得以下條件:

if(0xE2 != 0xE4 || 0xE2 != 0xE2) 
    //Error 

這將計算爲:

if(true || false) //Actually the second operand will not be evaluated 
    //Error 

將執行你的錯誤。實際上對於任何給定的輸入,你的錯誤函數都會執行。除非您的uint8_t值設法比較等於0xE20xE4,但據我所知,目前這個值不存在。

最簡單的解決辦法是改變你的「或」到「和」,給下面的代碼:

if(ui8BufferIn.at(0) != 0xE4 && ui8BufferIn.at(0) != 0xE2) 
    //Error 
3

你的邏輯是這樣:

If (value is not (value a)) OR (value is not (value b)) then... 

讓看可能性:

Value = a: then value is not b: result is true 
Value = b: then value is not a: result is true 
Value = other: the value is not a: result is true 

所以,如果語句總是判斷爲真

+0

Upvoted ...我覺得這個陳述總是正確的,因爲它不能同時爲謂詞錯誤。 –