Converter texto para binário, mas, problema com caracteres estranhos?

Estou convertendo String para Binário, seguindo alguns post aqui no grupo consegui fazer, mas ele faz errado, estou fazendo a conversão assim:

private String toBinary(String txt) {
        String textEncript = "";
        byte[] bytes = txt.getBytes();
        String[] binarios = new String[bytes.length];
        for (int i = 0; i < bytes.length; i++) {
            textEncript +=  Integer.toBinaryString(bytes[i]);
        }
        return textEncript;
 }

ele converte, mas se eu pegar esse binário e voltar para texto num conversor online, ele volta com caracteres estranhos sem falar que não converte na quantidade de bits certo, sempre vem com menos bits do que o esperado. Existe mais algum detalhes para essa conversão que eu não esteja fazendo?

Exemplo:
entro com a string abcdefgh (8 caracteres = 64 bits) depois de convertido ele retorna o binário:
11000011100010110001111001001100101110011011001111101000
que já não é mais 64 bits é só 56bits e se converter para texto retorna: ËL¹³è

Tem vários erros aí colega:

1 - quem disse que cada caracter corresponde a 8 bits ? O método getByte() usa a codificação da plataforma em que o programa executa, e nem sempre os caracteres são codificados em 8 bits. No entanto, você pode “forçar” uma determinada codificação, por exemplo

str.getBytes("UTF-8")

2 - outro detalhe importante é o método toBinayString(). Esse método descarta os 0’s à esquerda, portanto você precisa formatar a String com campos de largura fixa:

String.format("%08d", Integer.parseInt(strBin));

2 curtidas

Código correto:

DEMO

public String ToBynaryString(String value) throws UnsupportedEncodingException
{
        String result = "";        
        byte[] bytes = value.getBytes("UTF-8");
        StringBuilder binary = new StringBuilder();
        for (byte b : bytes)
        {
           int val = b;
           for (int i = 0; i < 8; i++)
           {
              binary.append((val & 128) == 0 ? 0 : 1);
              val <<= 1;
           }
           binary.append(' ');
        }        
        return binary.toString();
}

Link referente e direitos autorais: http://stackoverflow.com/a/917190

1 curtida

Valeu mendes pelas dicas, realmente era o zero a esquerda que estava sendo eliminado por isso a diferença.