如何将uint8_t数组与C中的十六进制值进行比较?

时间:2019-04-30 10:16:54

标签: c uint8t

我的代码中有预定义的HEX值。以下是其中之一。

#define ADDRESS1 0xD445556BD557
#define ADDRESS2 0xED612BDF113B

我也有一个uint8_t数组。像

uint8_t MAC[6];

如何在不编写新函数的情况下比较这两件事?

我已经尝试过

if(MAC == ADDRESS2)

3 个答案:

答案 0 :(得分:7)

也许您也应该将uint8_t数组用于ADDRESS *,并使用memcmp()

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

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

答案 1 :(得分:1)

  

如何在不编写新函数的情况下比较这两件事?

在不知道 endianess 的情况下,无法将uint8_t数组与大整数进行比较。也就是说,MAC[0]将对应于最高或最低有效字节。有4种可能的组合:

  • 如果MAC[0]对应于最低有效字节,并且CPU是
  • little endian ,则只需使用memcmp
  • 如果MAC[0]对应于最高有效字节,并且CPU是 big endian ,则可以简单地使用memcmp
  • 如果MAC[0]对应于 most 个有效字节,并且CPU为 little endian ,则需要使用bit从大整数中逐字节屏蔽掉转变。
  • 如果MAC[0]对应于最低有效字节,并且CPU为 big endian ,则需要使用bit从大整数中逐字节屏蔽掉转变。

屏蔽示例:

// 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 */ }
}

此外,如果数据是网络协议的一部分,则需要牢记“网络耐久性”。这就是通信协议的字节序,通常是大字节序。

答案 2 :(得分:-3)

您可以尝试将数组强制转换为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中的掩码。