Сокрытие числа в массиве больших указателей путем изменения наименее значимого бита элементов - PullRequest
0 голосов
/ 25 февраля 2019

Прямо из биты, скажу, что я почти не знаю, что я здесь делаю - у меня большие проблемы с захватом побитовых операторов в C. В качестве упражнения на одном из моих курсов я должен скрыть число (unsigned int) в массиве больших указателей (unsigned char), содержащем числа.Я делаю это, используя srand (с ключом, чтобы потом можно было его декодировать), чтобы выбрать конкретные элементы массива, а затем взять один бит из числа, которое я должен скрыть (перебирая все биты), и изменитьнаименее значимый бит элемента массива.Выбор элементов.

Хотя у меня есть общее представление, я не могу, несмотря на поиск в Google, вычислить битовые операции.Таким образом, имея size, который я должен кодировать в i-й серии цикла (i-th бит размера) и выбрав случайным образом current_element, это то, что я придумал, чтобы получить бит, а затем изменитьelement.

for (i=0; i<32; i++){    
    tmp = rand() % max;
    current_element = array[tmp];
    current_element ^= ((size >> i)  & 0x01)<<7;
}

Чтобы декодировать, я написал бы это аналогично (где размер стирается без знака без знака, в который я пытаюсь записать декодированное число):

for (i=0; i<32; i++){
        tmp = rand() % max;
        current_element = array[tmp];
        size = size ^ ((current_pixel.blue<<0)<<7);

    }

Эти двав различных функциях и srand() заранее добавляется в каждую из них.

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

1 Ответ

0 голосов
/ 25 февраля 2019

Я только собираюсь косвенно ответить на ваш вопрос.Я дам вам небольшой совет, который нужен многим новым программистам.
Если вы хотите научиться программировать, Хватит гуглить и думать.

Разбейте проблему на несколько шагов,Напишите псевдокод:

  encode:
     for each bit in message_word:
        select random array element
        if bit is set:
           toggle LSB of element.

  decode:
     for each bit in message_word:
        select random element
        if LSB is toggled:
           set bit in message_word

Теперь напишите код C для каждого из этих шагов.На самом деле у вас есть большинство частей.

 // for each bit in message_word
 for (i=0;i<sizeof(message_word); i++) {
   // select random array element
   tmp = rand() % max;
   current_element = array[tmp];
   // if bit is set:
   if ( bit_is_set(message_word,i) ) {
       // toggle LSB of element.
       toggle_lsb(current_element);
   }
 }

Теперь, когда вы приступили к базовым шагам, может быть, вы можете google "как немного переключить" .Но убедитесь, что вы понимаете ответ, прежде чем подключать его.

int bit_is_set(word,bit) { return ((word>>bit)&0x01); }
int toggle_lsb(word) { return word ^ 1; }

Однако - это все равно не будет работать.Зачем?Время подумать еще раз.Вы сделали копию значения по случайно выбранному индексу массива.Вы немного переключились в копии.Какое влияние это окажет на массив?

Решите это, и есть по крайней мере еще одна проблема.В функции декодирования, как вы будете реализовывать is_lsb_toggled?Как вы узнаете, должен ли данный бит быть 1 или 0?У вас есть вся необходимая информация.Удачи.

...