2014-11-05 4 views
0

У меня длинная строка с 48 бит в Java. Эта строка будет разделена на 8 строк длиной 6 бит. Каждая строка должна быть преобразована в символ ASCII. Поэтому следует использовать шестибитный код ASCII.Двоичная строка для ASCII 6 бит char в Java

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

Есть ли какая-то функция, которую я могу использовать для ее автоматического преобразования и что мне не нужно писать метод с помощью переключателя?

+1

Скорее, но, скорее всего, больше проблем, чем это целесообразно, было бы реализовать класс Charset для вас 6-битных символов. Затем вы можете просто прочитать данные как двоичные в строки, используя эту кодировку символов. –

+0

Вы пытаетесь описать кодировку Base-64? Если да, просто используйте кодировщик base-64. –

+0

ASCII - это 7-битный набор символов. Вы хотите, чтобы вы использовали первые 64 из этих 128 символов? –

ответ

-1

Разбить строку на байты (по 6 бит с 2 битами заполнения). Затем просто используйте массив, сопоставляющий байтовые значения с символьным значением ASCII.

Редактировать Хорошо, я неправильно понял ваш вопрос, поскольку у вас есть необработанные двоичные данные. Видимо, у вас есть строка из 1 и 0, например, «1010111» длиной 48. Фактическая реализация очень отличается (и намного проще). См. Мой другой ответ. Извините за путаницу.

+0

С пропиской вы имеете в виду два нуля? Должно ли заполнение быть перед моими 6-битами или после 6-бит? – DummerTroll

+0

Два бита, нули или единицы, не имеют значения. Идея состоит в том, чтобы преобразовать 6-битное значение в байт, поэтому у вас есть нормальное значение Java для индексации массива. Имейте запрос поиска char [], который индексируется байтовыми значениями. –

+0

Я что-то пробовал, но я не знаю, почему у меня нет выхода. Так вы это понимаете? http://pho.to/7nE66 – DummerTroll

0
public byte sixBitFromAscii(char asciiChar) { 
    if (asciiChar >= 0x60) { 
     System.out.println("Invalid character " + asciiChar); 
     return 0; 
    } 
    else { 
     return (byte)(asciiChar - 0x20); 
    } 
} 

public char asciiFromSixBit(byte sixBit) { 
    return (char) (sixBit + 0x20); 
} 
+0

Предположим, что это конкретное отображение из его 6-битных значений в ASCII. Там ряд стандартных, вероятно, он использует один из них, немного много, чтобы принять одно произвольно. –

+0

У вас есть право на ваше мнение, я полагаю. Однако никаких других современных 6-битных схем нет. –

+0

Если то, с чем он сталкивается, является чем-то вроде промышленности, и это современно, тогда вы определенно спорите. Если это упражнение класса, в котором 6-разрядная схема была брошена вместе инструктором, вряд ли это было бы так. Я думаю, что общее решение, которое обрабатывает оба случая, более полезно, если в нем не говорится, что это стандартная (или иначе структурированная) кодировка. –

0

Хорошо, благодаря разъяснению и отправке фактического стола, это становится очень простым. С отсортированной кодировкой мы можем просто преобразовать каталог и индекс в массив. Имейте в виду, что если вы вводили строку String of 0/1s, вам нужно будет немного свернуть, чтобы получить значение (с именем n в этом коде). В противном случае это будет одно и то же.

public class sixbit { 
    static final char[] CHARSET = 
     {'@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 
     'P','Q','R','S','T','U','V','W','X','Y','Z','[','\\',']','^', 
     '_',' ','!','"','#','$','%','&','\'','(',')','*','+',',','-', 
     '.','/','0','1','2','3','4','5','6','7','8','9',':',';','<', 
     '=','>','?'}; 

    public static void main(String[] args) { 
     // Sample String of length 48, maybe up of 1s and 0s 
     String input = "010011010100000001000011001011001111010110010010" ; 
     System.out.println(input); 
     String[] parts = splitInput(input); // Split into 6-bit pieces 
     for(String sixbit: parts) { 
      int n = Integer.parseUnsignedInt(sixbit, 2); 
      System.out.printf("%s -> %c \n", sixbit,CHARSET[n]);   
     }  
    } 

    private static String[] splitInput(String input) { 
     String[] parts = new String[8]; // 48 bits, 6 bits each means we get 8 characters; 
     int current_part = 0; 
     int current_bit = 0; 
     StringBuilder sb; 
     while(current_bit < 48) { 
      sb = new StringBuilder(); 
      for(int i=0; i < 6; i++) { 
       sb.append(input.charAt(current_bit));    
       current_bit++; 
      } 
      parts[current_part] = sb.toString(); 
      current_part++;      
     } 
     return parts; 
    } 
} 

старой версия

Другой способа loadLookupTable() только в том числе некоторые случайно бросил вместе записи таблицы, то это должно делать то, что вы хотите.

import java.util.*; 

public class sixbit { 
    static Map<String,Character> lookup = new HashMap<String,Character>(); 

    public static void main(String[] args) { 
     loadLookupTable(); 
     // Sample String of length 48, maybe up of 1s and 0s 
     String input = "111000111001100110101000110000110100111011110111" ; 
     System.out.println(input); 
     String[] parts = splitInput(input); // Split into 6-bit pieces 
     for(String sixbit: parts) { 
      char ch = lookup.get(sixbit); // Lookup each 6-bit String to get the corresponding character. 
      System.out.printf("%s -> %c \n", sixbit, ch); 
     } 

    } 

    private static String[] splitInput(String input) { 
     String[] parts = new String[8]; // 48 bits, 6 bits each means we get 8 characters; 
     int current_part = 0; 
     int current_bit = 0; 
     StringBuilder sb; 
     while(current_bit < 48) { 
      sb = new StringBuilder(); 
      for(int i=0; i < 6; i++) { 
       sb.append(input.charAt(current_bit));    
       current_bit++; 
      } 
      parts[current_part] = sb.toString(); 
      current_part++;      
     } 
     return parts; 
    } 

    private static void loadLookupTable() { 
     /* For each bit string you have in your table, add the corresponding character. It would be shorter code, 
     * and a touch faster to load this from an array, but it would take a bit of thought and wouldn't be as clear. 
     * Grab enough to work for this example, so that this program works. Just need to make sure the full lookup is loaded 
     * properly. 
     */ 
     lookup.put("100110", 'a'); 
     lookup.put("100111", 'b'); 
     lookup.put("101000", 'c'); 
     lookup.put("110000", 'k'); 
     lookup.put("110100", 'o'); 
     lookup.put("110111", 'r'); 
     lookup.put("111000", 's'); 
     lookup.put("111001", 't'); 
     // and so on... 
     lookup.put("111011", 'v'); 
     lookup.put("111100", 'w'); 
     lookup.put("111101", 'x'); 
     lookup.put("111110", 'y'); 
     lookup.put("111111", 'z'); 
    } 
} 
+0

Метод splitInput - это не лучший способ разделения String/Array. Я написал это так, чтобы было легко следовать на основе фрагмента кода, который вы публикуете. –

Смежные вопросы