将8位无符号整数与HEX失败进行比较

时间:2016-06-15 17:38:52

标签: c++ hex unsigned-integer

我有一个C ++ Vector,其中包含来自TCP数据段的uint8_t值。我正在寻找应该在向量的第一个索引处的两个值中的一个。

我有以下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在HEX中整数是0xE2

我已经有一段时间了,所以它很可能很简单,但任何帮助都会很棒!

3 个答案:

答案 0 :(得分:3)

我想你可能想要你的逻辑:

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

现在你正在说"如果是以下任何一种情况:(它不是0xE4)或者是:(它不是0xE2 ),我们遇到了问题" - 如果我理解正确的话,那不是你想说的。根据您的陈述,您可能会收到0xE2,但由于您未获得0xE4ui8BufferIn.at(0) != 0xE4),您的陈述将会执行。

答案 1 :(得分: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

所以if语句总是计算为true

答案 2 :(得分: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