Как сравнить массив uint8_t с шестнадцатеричным значением в C? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть предопределенные значения HEX в моем коде. Один из них в следующем.

#define ADDRESS1 0xD445556BD557
#define ADDRESS2 0xED612BDF113B

У меня также есть массив uint8_t. Нравится

uint8_t MAC[6];

Как я могу сравнить эти две вещи без написания новой функции?

Я уже пробовал

if(MAC == ADDRESS2)

Ответы [ 3 ]

7 голосов
/ 30 апреля 2019

Может быть, вам следует использовать массив uint8_t и для ADDRESS *, и использовать memcmp():

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

if (memcmp(MAC, ADDRESS1, sizeof(ADDRESS1)) == 0)
1 голос
/ 30 апреля 2019

Как я могу сравнить эти две вещи без написания новой функции?

Вы не можете сравнить массив uint8_t с большим целым числом, не зная порядка байтов ,То есть MAC[0] будет соответствовать старшему или младшему байту.Существует 4 возможных комбинации:

  • Если MAC[0] соответствует младший значащий байт, а ЦП little-endian , вы можете просто использовать memcmp.
  • Если MAC[0] соответствует наиболее значащему байту, а ЦП big endian , вы можете просто использовать memcmp.
  • Если MAC[0] соответствует наиболее значащему байту, а ЦП little endian , вам необходимо замаскировать байт за байтом из большого целого числа с помощью битовых сдвигов.
  • Если MAC[0] соответствует значению наименьший значащий байт, а ЦП 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 */ }
}

Кроме того, если данные являются частью сетевых протоколов, вам необходимо иметь в виду «сетевую бесконечность».Это порядковый номер протокола связи, который чаще всего является прямым порядком байтов.

0 голосов
/ 30 апреля 2019

Вы можете попробовать привести ваш массив к указателю на 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.

...