Binário para enviar mensagens de texto em java
-
25-09-2019 - |
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!
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();
}