2017-01-31 2 views
4

Я пытаюсь сохранить сопоставление букв с двоичным числом. Вот мои картыСохранение charcter и двоичного числа в хэш-карте

("h",001) 
("i", 010) 
("k",011) 
("l",100) 
("r", 101) 
("s",110) 
("t",111) 

Для этой цели я создал карту хэша и сохранил пары значений ключа. Теперь я хочу отобразить соответствующее двоичное значение для данного предложения. Вот мой код для того же самого.

package crups; 

import java.util.*; 


public class onetimepad { 

public static void main(String args[]) 
{ 
    HashMap <String , Integer>hm = new HashMap <String , Integer>(); 
    hm.put("e", 000); 
    hm.put("h",001); 
    hm.put("i", 010); 
    hm.put("k",011); 
    hm.put("l",100); 
    hm.put("r", 101); 
    hm.put("s",110); 
    hm.put("t",111); 



    String[] key = { "t" ,"r" , "s" , "r","t","l","e", "r","s","e"}; 
    //key = t r s r t l e r s e 
    String[] input = {"h","e","i" ,"l","h","i","t","l","e","r"}; 
    int[] cipher = new int[10]; 
    System.out.println("Binary form of text is ...."); 

    for(String s : input) 
    { 
     System.out.print(hm.get(s)+" "); 
    } 

} 

} 

Когда я запускаю код, однако, отображение для буквы «я» отображается неправильно: 8: вместо 010. Может кто-нибудь мне рассказать, почему это происходит? Также как я могу отображать ноль infront моих чисел, поскольку они являются двоичными числами. Спасибо.

Выход:

Binary form of text is .... 
1 0 8 100 1 8 111 100 0 101 
+4

хранить их в виде строк вместо чисел ("001"). – shmosel

+0

Это интересный вводный текст, который у вас есть. –

+0

Следующим шагом в этой проблеме является выполнение операции «xor» для двоичных чисел. если я использую их как строки, мне придется преобразовать их в int, а затем выполнить xor? Может ли быть альтернатива, так что я могу прямо хранить их как двоичные на моей карте. @ Shmosel –

ответ

2

Вы просто не можете хранить их с ведущим нулем. Ведение нуля до целого означает, что это восьмеричное число.

Поскольку ваш следующий шаг - XOR, я рекомендую этот подход.

  1. Вы можете хранить эти целые числа, используя простые базовые 10 чисел. Мы будем конвертировать их, когда это необходимо, в виде двоичных файлов. (вы можете также хранить их просто как двоичные с ведущими 0b. See this answer for more details.
  2. Использование Integer.toString(hm.get(s), 2); для отображения двоичного числа. Оригинальный номер еще Integer, так что вы можете использовать его для работы XOR.
  3. Для отображения двоичного файла с ведущий ноль, я играл с некоторыми строковыми методами, как это:

    String temp = "000", binary; 
    for(String s : input) { 
        binary = Integer.toString(hm.get(s), 2); 
        System.out.print(temp.substring(0, 3-binary.length()) + binary +" "); 
    } 
    

Вот что окончательный код выглядит следующим образом:

Выход

Binary form of text is .... 
001 000 010 100 001 010 111 100 000 101 

Код

import java.util.*; 

public class onetimepad { 
    public static void main(String args[]) { 
     HashMap <String , Integer>hm = new HashMap <String , Integer>(); 
     hm.put("e", 0); //or use hm.put("e", 0b000); 
     hm.put("h", 1); //or use hm.put("e", 0b001); 
     hm.put("i", 2); 
     hm.put("k", 3); 
     hm.put("l", 4); 
     hm.put("r", 5); 
     hm.put("s", 6); 
     hm.put("t", 7); 

     String[] key = { "t" ,"r" , "s" , "r","t","l","e", "r","s","e"}; 
     //key = t r s r t l e r s e 
     String[] input = {"h","e","i" ,"l","h","i","t","l","e","r"}; 
     int[] cipher = new int[10]; 
     System.out.println("Binary form of text is ...."); 

     String temp = "000", binary; 
     for(String s : input) { 
      binary = Integer.toString(hm.get(s), 2); 
      System.out.print(temp.substring(0, 3-binary.length()) + binary +" "); 
     } 
    } 
} 
+0

** Предупреждение о вреде для здоровья: ** Результаты XOR будут чувствовать себя совершенно случайными (ОП изложено в комментариях выше, что следующим шагом будет использование XOR на них). –

+1

@ LukeBriggs мой плохой. Я не видел этого комментария. Однако, спасибо за уведомление, я обновил свой ответ соответственно. –

+0

@RamanSahasi: Большое спасибо, сэр. Это было полезно –

2

Во-первых, ваша Map декларация и инициализация откусил. Чтобы использовать бинарные константы, вы префикс его 0b - и запрограммируйте на интерфейс Map (а не на реализацию HashMap). И, начиная с Java 7, вы можете использовать алмазный оператор <> для сокращения расходов.

Map<String, Integer> hm = new HashMap<>(); 
hm.put("e", 0b000); 
hm.put("h", 0b001); 
hm.put("i", 0b010); 
hm.put("k", 0b011); 
hm.put("l", 0b100); 
hm.put("r", 0b101); 
hm.put("s", 0b110); 
hm.put("t", 0b111); 

Тогда для печати, у вас есть Integer (s), но вы хотите их двоичное представление.Таким образом, вы можете сделать что-то подобное,

for (String s : input) { 
    System.out.print(Integer.toBinaryString(hm.get(s)) + " "); 
} 

Что я побежал, чтобы получить (как я полагаю, вы ожидали)

Binary form of text is .... 
1 0 10 100 1 10 111 100 0 101 

Если вы действительно хотите ведущие нули (в три разрядные двоичный формате) вы могли бы сделать ,

for (String s : input) { 
    StringBuilder sb = new StringBuilder(Integer.toBinaryString(hm.get(s))); 
    while (sb.length() < 3) { 
     sb.insert(0, '0'); 
    } 
    System.out.print(sb.append(" ")); 
} 

Какие выходы

Binary form of text is .... 
001 000 010 100 001 010 111 100 000 101 
+0

Большое спасибо. Это было точно. Чтобы убедиться, что я правильно понял, я могу хранить двоичные числа в int простым форматом «0b000» .... «0b100» и так далее. –

+0

@vishrutsharma Вот как вы используете двоичный литерал. Все номера двоичные на цифровом компьютере. –

+0

В этом случае мне не нужно использовать целую «Integer.toBinaryString», и поэтому вы можете напрямую отображать содержимое моей хэш-карты (без преобразования в String). Впоследствии выполните XOR по содержимому, не выполняя никаких преобразований. –

0

Спасибо за ваши ребята. Я закончил одну часть своей проблемы, и мне потребовалось зашифровать мой входной текст: «Heilhitler» и представить его в двоичном формате. Это был код, который я смог построить с вашими предложениями.

public static void main(String args[]) 
    { 
     HashMap <String , Integer>hm = new HashMap <String , Integer>(); 
     hm.put("e", 0); 
     hm.put("h",1); 
     hm.put("i", 2); 
     hm.put("k",3); 
     hm.put("l",4); 
     hm.put("r",5); 
     hm.put("s",6); 
     hm.put("t",7); 
String[] key = { "t" ,"r" , "s" , "r","t","l","e", "r","s","e"}; 
    //key = t r s r t l e r s e 
    String[] input = {"h","e","i" ,"l","h","i","t","l","e","r"}; 

    int[] inter1 = new int[10];  
    System.out.println("Binary form of text is ...."); 
    int i = 0 ; 
    for(String s : input) 
    { 

     String binarystr = Integer.toBinaryString(hm.get(s)) ; 
     System.out.print(binarystr+" "); 
     inter1[i]=Integer.parseInt(binarystr) ; 
     i++ ; 
    } 

    int[] inter2 = new int[10]; 
    int m= 0 ; 
    for(String s : key) 
    { 
     String binarystr = Integer.toBinaryString(hm.get(s)) ; 
     System.out.print(binarystr+" "); 
     inter2[m]=Integer.parseInt(binarystr) ; 

     m++ ; 
    } 


    int[] cipher = new int[10]; 
    for(int j = 0 ; j < 10 ; j++) 
    { 
     cipher[j] = inter1[j]^inter2 [j]; //performing xor between input and key 
    } 
    System.out.println("Cipher is ....."); 
    for(int j= 0 ; j < 10; j++) 
    { 
     System.out.print(" " + cipher[j]); 
    } 

    //-------------------Decryption //---------------------------- 
    //Performing XOR between the cipher and key again 
    int[] decry = new int[10] ; 

    for(int j = 0 ; j < 10 ; j ++) 
    { 
     decry[j] = cipher[j]^inter2[j]; 
    } 
    System.out.println(" "); 
    System.out.println("Decrypted result in Binary format"); 
    for(int j= 0 ; j < 10; j++) 
    { 
     System.out.print(" " + decry[j]); 
    } 

    } 
    } 

Выход:

Binary form of text is .... 
1 0 10 100 1 10 111 100 0 101 
Cipher is ..... 
110 101 100 1 110 110 111 1 110 101 
Decrypted result in Binary format 
1 0 10 100 1 10 111 100 0 101 
Смежные вопросы