Pergunta

Eu tenho uma string com dados binários (1110100), quero obter o texto para que eu possa imprimi -lo (1110100 imprimiria "T"). Eu tentei isso, é semelhante ao que eu costumava transformar meu texto em binário, mas não está funcionando:

    public static String toText(String info)throws UnsupportedEncodingException{
        byte[] encoded = info.getBytes();
        String text = new String(encoded, "UTF-8");
        System.out.println("print: "+text);
        return text;
    }

Quaisquer correções ou sugestões seriam muito apreciadas.

Obrigado!

Foi útil?

Solução

Você pode usar Integer.parseInt com um radix de 2 (binário) para converter a corda binária em um número inteiro:

int charCode = Integer.parseInt(info, 2);

Então, se você deseja o personagem correspondente como uma string:

String str = new Character((char)charCode).toString();

Outras dicas

Eu sei que o OP afirmou que o binário deles estava em um String formato, mas por uma questão de completude, pensei em adicionar uma solução para converter diretamente de um byte[] a uma representação alfabética da corda.

Como Casablanca declarou que você basicamente precisa obter a representação numérica do caráter alfabético. Se você está tentando converter algo mais tempo do que um único personagem, provavelmente virá como um byte[] e em vez de convertê -lo em uma string e depois usar um loop para anexar os caracteres de cada byte você pode usar BYTEBUFFER e Charbuffer Para fazer o levantamento para você:

public static String bytesToAlphabeticString(byte[] bytes) {
    CharBuffer cb = ByteBuffer.wrap(bytes).asCharBuffer();
    return cb.toString();
}

NB usa o conjunto de char utf

Como alternativa, usando o construtor de string:

String text = new String(bytes, 0, bytes.length, "ASCII");

Este é o meu (funcionando bem no Java 8):

String input = "01110100"; // Binary input as String
StringBuilder sb = new StringBuilder(); // Some place to store the chars

Arrays.stream( // Create a Stream
    input.split("(?<=\\G.{8})") // Splits the input string into 8-char-sections (Since a char has 8 bits = 1 byte)
).forEach(s -> // Go through each 8-char-section...
    sb.append((char) Integer.parseInt(s, 2)) // ...and turn it into an int and then to a char
);

String output = sb.toString(); // Output text (t)

e a impressão de método compactado para consolar:

Arrays.stream(input.split("(?<=\\G.{8})")).forEach(s -> System.out.print((char) Integer.parseInt(s, 2))); 
System.out.print('\n');

Tenho certeza de que existem maneiras "melhores" de fazer isso, mas essa é a menor que você provavelmente pode obter.

Aqui está a resposta.

private String[] splitByNumber(String s, int size) {
    return s.split("(?<=\\G.{"+size+"})");
}

O contrário (onde "Info" é o texto de entrada e "s" a versão binária dele)

byte[] bytes = info.getBytes();
BigInteger bi = new BigInteger(bytes);
String s = bi.toString(2); 

Olhe para a parseInt função. Você também pode precisar de um elenco e o Character.toString função.

public static String binaryToText(String binary) {
    return Arrays.stream(binary.split("(?<=\\G.{8})"))/* regex to split the bits array by 8*/
                 .parallel()
                 .map(eightBits -> (char)Integer.parseInt(eightBits, 2))
                 .collect(
                                 StringBuilder::new,
                                 StringBuilder::append,
                                 StringBuilder::append
                 ).toString();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top