Что делает функция C bit_get в шифровании DES? - PullRequest
1 голос
/ 14 октября 2010

Я наткнулся на этот кусок кода, читая о шифровании DES. Интересно, что он делает именно?

Я вижу, что он возвращает 1 или 0 в соответствии с результатом последнего if. Я также понимаю, что маска в шестнадцатеричном и равна 128 в десятичном виде (почему это конкретное значение?). Цикл for начинается с 0 до pos% 8, почему? (Я знаю, что, например, если pos = 14, то 14% 8 = 6).

int bit_get(const unsigned char *bits, int pos)
{
 unsigned char mask;
 int i;
 mask = 0x80;

 for (i = 0; i < (pos % 8); i++)
 mask = mask >> 1;
 return (((mask & bits[(int)(pos / 8)]) == mask) ? 1 : 0);
}

Спасибо! и хорошего дня :) 1006

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

Получает pos -й бит (старший значащий бит = 0-й) из 8-битного массива символов bits.

Обычно unsigned char имеет длину 8 бит. Следовательно,

bits[(int)(pos / 8)]

сначала извлечет октет, в котором находится нужный бит. (pos = 8 & times; pos/8 + pos%8)

Затем мы получаем фактический бит из октета:

  10111010
# 01234567

Чтобы извлечь немного, мы выполняем & с «маской». Операция & выполняется по битам, которая возвращает 1, если 1 присутствует в одном и том же бите в обоих операндах, в противном случае - 0, например,

  10111010
& 11010001
= 10010000

Поэтому, чтобы извлечь 0-й бит, мы & с 10000000 = 0x80, а с 1-м битом мы & с 01000000 = 0x40 и т. Д. Цикл должен получить правильную маску.

Но & дает только 0x80, 0x40 и т. Д. Или 0, вместо 1 или 0. Окончательное условное

(mask & bits[...]) == mask) ? 1 : 0

выполняет задание по преобразованию ненулевой маски в 1 и от 0 до 0.


Кстати, обычно мы используем оператор сдвига битов >> или << для вычисления маски. Это более эффективно и понятно для тех, кто знает битовые операции.

int bit_get(const uint8_t* bits, int pos) {
    uint8_t mask = 1 << (7 - pos % 8);
    return (bits[pos/8] & mask) ? 1 : 0;
}
1 голос
/ 14 октября 2010

Я не уверен, почему он просто не сделал mask >> (pos % 8) вместо цикла.

0x80 является двоичным 10000000, что означает, что вы начинаете с маскировки наиболее значимого бита,так как это единственный с 1.

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