[英]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.