如何将 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"。那就是通信协议的字节顺序,通常是大端。
我在我的代码中预定义了十六进制值。其中之一如下。
#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"。那就是通信协议的字节顺序,通常是大端。