簡體   English   中英

如何將uint8_t數組與C中的十六進制值進行比較?

[英]How to compare uint8_t array to a hex value in C?

我的代碼中有預定義的十六進制值。 以下是其中之一。

#define ADDRESS1 0xD445556BD557
#define ADDRESS2 0xED612BDF113B

我也有一個uint8_t數組。 喜歡

uint8_t MAC[6];

如何在不編寫新函數的情況下比較這兩件事?

我已經嘗試過

if(MAC == ADDRESS2)

也許您也應該將uint8_t數組用於ADDRESS *,並使用memcmp()

static const uint8_t ADDRESS1[] = {0xD4, 0x45, 0x55, 0x6B, 0xD5, 0x57};

if (memcmp(MAC, ADDRESS1, sizeof(ADDRESS1)) == 0)

如何在不編寫新函數的情況下比較這兩件事?

您不能在不知道endianess的情況下將uint8_t數組與大整數進行比較。 即, MAC[0]對應於最高或最低有效字節。 有4種可能的組合:

  • 如果MAC[0]對應於最低有效字節,並且CPU是低位字節序 ,則可以簡單地使用memcmp
  • 如果MAC[0]對應於最高有效字節,並且CPU是big endian ,則可以簡單地使用memcmp
  • 如果MAC[0]對應於最高有效字節,並且CPU是little endian ,則需要使用移位將字節從大整數中逐字節屏蔽掉。
  • 如果MAC[0]對應於最低有效字節,並且CPU是big endian ,則需要使用移位將字節逐字節從大整數中屏蔽掉。

掩膜示例:

// assuming MAC[0] is ms byte
for(size_t i=0; i<6; i++)
{
  uint8_t byte = (ADDRESS1 >> (i*8));
  if(MAC[6-1-i) != byte)
  { /* not equal, do something */ }
}

另外,如果數據是網絡協議的一部分,則需要牢記“網絡耐久性”。 這就是通信協議的字節序,通常是大字節序。

您可以嘗試將數組強制轉換為long long指針,然后檢查其下的值。 問題是只有6 * 8 = 48位,但是您可以使用位掩碼刪除多余的字節。

ADDRESS1 == (*((long long*)MAC) & 0xFFFFFFFFFFFF)

完整示例: https : //ideone.com/kFc8h0

#define ADDRESS1 0xD445556BD557
#define ADDRESS2 0xED612BDF113B
static const uint8_t ADDRESS[6] = { 0x57, 0xD5, 0x6B, 0x55, 0x45, 0xD4 };

int main()
{
    if (ADDRESS1 == (*((long long*)ADDRESS) & 0xFFFFFFFFFFFF)) {
        std::cout << "ADDRESS1\n";
    }
    if (ADDRESS2 == (*((long long*)ADDRESS) & 0xFFFFFFFFFFFF)) {
        std::cout << "ADDRESS2\n";
    }
}

請注意,在示例中,我必須反轉ADDRESS數組中的字節以匹配ADDRESS1中的掩碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM