Кодирование сдвигом полубайтов и инверсией
Реализовать функции шифровки и дешифровки методом циклического сдвига битов на 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 [9299 просмотров]