Что делает эта строка кода? - PullRequest
0 голосов
/ 05 марта 2011
for (nbyte=0; nbyte<6; nbyte++) {
    mac->byte[nbyte] = (char) (strtoul(string+nbyte*3, 0, 16) & 0xFF);
}

Это небольшой фрагмент кода, найденный в macchanger, string - это указатель на символ, указывающий MAC-адрес, но я не знаю, почему я должен преобразовать его в unsigned long int, и почемутогда я * 3 И это с 0xFF.

Ответы [ 3 ]

4 голосов
/ 05 марта 2011

Скорее всего, строка является MAC-адресом в виде

XX:YY:ZZ:AA:BB:CC

Выполнение nbyte*3 перемещает указатель «начальное смещение» на 3 символа в строке на каждой итерации, пропуская :. Затем strotoul читает 16 бит (2 символа) и преобразует их в длинную без знака, которая затем AND и 0xFF удаляют все байты, кроме младшего, которые приводятся к типу char.

3 голосов
/ 05 марта 2011

Это синтаксический анализ шестнадцатеричной строки. Третий параметр strtoul является основой преобразования (16 в данном случае). Вход предположительно в этой форме:

12:34:56:78:9a:bc

Указатель увеличивается на 3 каждый раз, чтобы начинаться с каждой пары шестнадцатеричных цифр, которые разделены тремя, включая двоеточие.

Я не думаю, что & 0xFF здесь строго необходимо. Предположительно, там была попытка правильно обработать случай, когда вход содержит число больше 0xFF, но алгоритм по-прежнему не работает в этом случае по другим причинам.

2 голосов
/ 05 марта 2011
string+nbyte*3

string - указатель на символ (как и все строки C).Когда вы добавляете целое число x к указателю, вы получаете указатель местоположения + x.Добавляя nbyte * 3, вы добавляете 3 к указателю, затем 6, затем 9-й,

strtoul преобразует строки в целые числа.В частности, здесь, передавая 16, указывается его основание 16 (шестнадцатеричное) в качестве формата в строке.Здесь, передавая nbyte * 3, ваш указатель указывает на подстроку, начинающуюся с 3-го, 6-го, 9-го и т. Д. Символа строки.

После преобразования в каждом месте, & 0xFF отменяет любые биты после 8 LSBзатем преобразует это значение в символ.

Результат сохраняется в ячейке байтового массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...