БлогNot. Кодирование сдвигом полубайтов и инверсией

Кодирование сдвигом полубайтов и инверсией

Реализовать функции шифровки и дешифровки методом циклического сдвига битов на 1 бит вправо в левом полубайте и на 1 бит влево в правом полубайте asci-кодов символов с инверсией всех битов.

Функция shift1 выполняет кодирование байта "туда", а shift2 - "обратно". Поскольку для всех возможных значений байта от 0 до 255 включительно проверяется соответствие дважды перекодированного байта начальному, то есть надежда, что функции работают правильно.

#include <stdio.h>
 
unsigned char shift1 (unsigned char b) {
 unsigned char bit=b&0x08?1:0;
 unsigned char right=((b<<1)&0x0E)|bit;
 bit=b&0x10?0x80:0;
 unsigned char left=bit|((b>>1)&0x70);
 return ~(left|right);
}
unsigned char shift2 (unsigned char b) {
 b=~b;
 unsigned char bit=b&0x80?0x10:0;
 unsigned char left=((b<<1)&0xE0)|bit;
 bit=b&0x01?0x08:0;
 unsigned char right=bit|((b>>1)&0x07);
 return left|right;
}
int main() {
 unsigned char c,c1,c2; int i,bad=0;
 for (i=0; i<256; i++) {
  c=(unsigned char)i;
  c1=shift1(c);
  c2=shift2(c1);
  if (c2!=c) {
   printf ("\n%c (0x%02X) => %c (0x%02X) => %c (0x%02X)",c,c,c1,c1,c2,c2);
   bad++;
  }
 }
 if (!bad) printf ("\nВСЕ ВЕРНО");
 else printf ("\nНЕВЕРНЫХ БАЙТ: %d",bad);
 fflush(stdin);
 getchar();
 return 0;
}

При желании можно к каждой из функций добавить параметр "число шагов" и делать сдвиг столько раз, сколько записано в этом параметре, тогда кодирование приобретёт "ключ" и станет шифрованием.

05.12.2013, 17:02 [9184 просмотра]


теги: c++ алгоритм

К этой статье пока нет комментариев, Ваш будет первым