我的代码中有预定义的HEX值。以下是其中之一。
#define ADDRESS1 0xD445556BD557
#define ADDRESS2 0xED612BDF113B
我也有一个uint8_t数组。像
uint8_t MAC[6];
如何在不编写新函数的情况下比较这两件事?
我已经尝试过
if(MAC == ADDRESS2)
答案 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是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中的掩码。