Как правильно сравнить два неподписанных символа? - PullRequest
1 голос
/ 05 мая 2011

Глядя для сравнения двух

BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];

из структуры IP_ADAPTER_ADDRESSES

, где байт определяется в Windows как typedef unsigned char BYTE;

Do Iнужно сравнить память?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 05 мая 2011

Будьте осторожны: определение PhysicalAddress, как объяснено в документации, равно

  BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];

т.е. это массив из BYTE с. Тем не менее, вы можете легко сравнить их с memcmp из <string.h> (или <cstring>, если вы используете C ++):

// The two structures
IP_ADAPTER_ADDRESSES iaa1, iaa2;
// The result of the comparison
int result;

//...

if(iaa1.PhysicalAddressLength!=iaa2.PhysicalAddressLength)
{
    // We have two physical addresses of two different lengths; depending on what
    // you want to do it may be an error or just a simpler case of comparison
}
else
{
    // Perform the comparison
    result = memcmp(iaa1.PhysicalAddress, iaa2.PhysicalAddress, iaa1.PhysicalAddressLength);
}
3 голосов
/ 05 мая 2011

Сравните? Просто используйте обычные операторы равенства и / или сравнения. Что-то не так с этим подходом? Почему ты вдруг хочешь сравнить память?

1 голос
/ 05 мая 2011

Маттео избил меня до этого.Его ответ правильный.К сожалению, я не смог прокомментировать его сообщение (возможно, я слишком новичок здесь), но я хотел подтвердить его ответ, поскольку большинство ответов до сих пор неверны.

Тип данных, о котором идет речь, представляет собой массивбайт.

НЕ используйте оператор равенства (==) для сравнения значений двух массивов, он будет иметь значение true, только если вы сравниваете тот же массив с самим собой .Даже если байтовые массивы имеют одинаковые значения для каждого из своих элементов, но являются разными массивами (и, следовательно, находятся в разных местах в памяти), оператор равенства вернет false.

По сути, массив простоуказатель в памяти.Вот два способа объявить массивы:

    int * pointer = new int[5];

или:

    int array[] = new int[5];

Вы можете получить доступ к первому элементу с помощью:

    *pointer = 100;  // Dereference the pointer to get the int at that location

или:

    array[0] = 100;

Вы даже можете сделать:

    *array = 100;

или:

    pointer[0] = 100;

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

Я надеюсь, что это подходящая информация для вашего уровня квалификации :) Если нет, возможно, это поможет кому-то еще.Кроме того, прошло некоторое время с тех пор, как я имел удовольствие использовать C ++, так что, надеюсь, все правильно.

...