如何将 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)

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

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

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

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

How can I compare this two things without writing a new function?

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

  • 如果MAC[0]对应最小有效字节,而CPU是小端,则可以只需使用 memcmp.
  • If If MAC[0] 对应于 most 有效字节并且 CPU 是 big endian, 你可以简单地使用 memcmp.
  • 如果MAC[0]对应有效字节,而CPU是小端,则需要使用移位从大整数中逐字节屏蔽掉。
  • 如果MAC[0]对应于least有效字节并且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 */ }
}

此外,如果数据是网络协议的一部分,您需要牢记 "network endianess"。那就是通信协议的字节顺序,通常是大端。