Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Lab6 {
- private static final int sizeOfBlock = 6; //размер нашего битового блока
- private static final int sizeOfChar = 1; //размер одного символа
- private static final int a = 4;
- private static final int b = 2;
- private static final int[][] S_Block1 = {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
- {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
- {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
- {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 10}};
- private static String StringToRightLength(String input) {
- while (((input.length() * sizeOfChar ) % sizeOfBlock) != 0)
- input += "0";
- return input;
- }
- private static String[] CutStringIntoBlocksEncode(String input) {
- String[] Blocks = new String[(input.length() * sizeOfChar)/sizeOfBlock];
- int lengthOfBlock = input.length() / Blocks.length;
- for (int i = 0; i < Blocks.length; i++) {
- Blocks[i] = input.substring(i * lengthOfBlock, lengthOfBlock * (i + 1));
- }
- return Blocks;
- }
- private static String Right_length(String mystring, int length){
- while (mystring.length() != length){
- StringBuilder new_culumn = new StringBuilder(mystring);
- new_culumn.insert(0,"0");
- mystring = new_culumn.toString();
- }
- return mystring;
- }
- private static void Decode_SBlock(String[] Blocks){
- for (int i = 0; i < Blocks.length; i++) {
- String charAt1 = String.valueOf(Blocks[i].charAt(0));
- String charAt2 = String.valueOf(Blocks[i].charAt(1));
- //удаляем из блока номер строки в битах(первые два символа)
- StringBuilder sb = new StringBuilder(Blocks[i]);
- sb.delete(0,2);
- Blocks[i] = sb.toString();
- int row = bin2dec(charAt2.concat(charAt1)); //получаем номер строки в десятичной системе, соединяя первые два символа блока
- for (int column = 0; column < 16; column++) {
- if (bin2dec(Blocks[i]) == S_Block1[row][column]) { //ищем в нашей матрице такой же блок
- String rowdec2 = Integer.toBinaryString(row); //получаем номер строки и переводим в двоичный код
- rowdec2 = Right_length(rowdec2,2); //доводим до нужной длины
- String columndec2 = Integer.toBinaryString(column);//получаем номер столбца и переводим в двоичный код
- columndec2 = Right_length(columndec2, 4); //доводим до нужной длины
- String charAtnew1 = String.valueOf(rowdec2.charAt(0));
- String charAtnew2 = String.valueOf(rowdec2.charAt(1));
- Blocks[i] = addChar(columndec2, charAtnew2, b - 1); //добавляем к двоичному коду столбца бит строки
- Blocks[i] = addChar(Blocks[i], charAtnew1, a - 1); //добавляем к двоичному коду столбца и биту строки еще один бит строки
- }
- }
- }
- PrintMyBlocks(Blocks);
- }
- public static void PrintMyBlocks(String[] blocks){
- for (String s : blocks ) {
- System.out.print(s);
- }
- System.out.println("\n");
- }
- public static String addChar(String str, String ch, int position) {
- StringBuilder sb = new StringBuilder(str);
- sb.insert(position, ch);
- return sb.toString();
- }
- private static void Encode_SBlock(String[] Blocks){
- String[] Blocks_new = new String[Blocks.length];
- for (int i = 0; i < Blocks.length; i++) {
- String charAt1 = String.valueOf(Blocks[i].charAt(0));
- String charAt2 = String.valueOf(Blocks[i].charAt(b - 1));
- String charAt3 = String.valueOf(Blocks[i].charAt(2));
- String charAt4 = String.valueOf(Blocks[i].charAt(a - 1));
- String charAt5 = String.valueOf(Blocks[i].charAt(4));
- String charAt6 = String.valueOf(Blocks[i].charAt(5));
- int row = bin2dec(charAt2.concat(charAt4)); //получаем номер строки, соединяя биты четвертый и второй
- int column = bin2dec(((charAt1.concat(charAt3)).concat(charAt5)).concat(charAt6)); //получаем номер столбца, соединяя остальные биты
- String k = Integer.toBinaryString(row); //переводим номер строки в десятичную систему
- k = Right_length(k, 2); //доводим до правильной длины
- Blocks_new[i] = Integer.toBinaryString(S_Block1[row][column]); //находим наш блок на пересечении нашей строки и стоблца и переводим его в двоичный
- Blocks_new[i] = Right_length(Blocks_new[i], 4); //доводим до правильной длины
- Blocks_new[i] = k.concat(Blocks_new[i]); //соединяем его со строкой
- }
- PrintMyBlocks(Blocks_new);
- }
- private static void Encode(){
- String k = StringToRightLength("0101001010101101101010");
- System.out.println("Сообщение:\n" + k);
- System.out.println("\n");
- System.out.println("Сообщение после кодировки:");
- Encode_SBlock(CutStringIntoBlocksEncode(k));
- }
- private static void Decode(){
- String k = StringToRightLength("111111000000110011000101");
- System.out.println("Сообщение после раскодировки: ");
- Decode_SBlock(CutStringIntoBlocksEncode(k));
- }
- public static int bin2dec(String binNumber) {
- return Integer.parseInt( binNumber, 2);
- }
- public static void main(String[] args) {
- Encode();
- Decode();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement