Quiero convertir una Cadena binaria de poniéndolo en una matriz de bytes (String.getBytes[]) y, a continuación, la tienda de la cadena binaria para cada byte (Integer.toBinaryString(bytearray)) en un String[]. Luego quiero volver a la normalidad de la Cadena a través de Byte.parseByte(stringarray[i], 2). Esto funciona muy bien para ASCII estándar de la Tabla, pero no para el extendido. Por ejemplo, un A me da 1000001, pero un Ä devuelve

11111111111111111111111111000011
11111111111111111111111110000100

Alguna idea de cómo manejar esto?

public class BinString {
    public static void main(String args[]) {
        String s = "ä";
        System.out.println(binToString(stringToBin(s)));

    }

    public static String[] stringToBin(String s) {
        System.out.println("Converting: " + s);
        byte[] b = s.getBytes();
        String[] sa = new String[s.getBytes().length];
        for (int i = 0; i < b.length; i++) {
            sa[i] = Integer.toBinaryString(b[i] & 0xFF);
        }
        return sa;
    }

    public static String binToString(String[] strar) {
        byte[] bar = new byte[strar.length];
        for (int i = 0; i < strar.length; i++) {
            bar[i] = Byte.parseByte(strar[i], 2);
            System.out.println(Byte.parseByte(strar[i], 2));

        }
        String s = new String(bar);
        return s;
    }

}

OriginalEl autor anonymous001 | 2011-04-04

2 Comentarios

  1. 8

    Primero: «ASCII extendido» es muy engañoso el título que se utiliza para referirse a una tonelada de diferentes codificaciones.

    Segundo: byte en Java es firmado, mientras que los bytes en codificaciones son generalmente manejados como unsigned. Desde que uso Integer.toBinaryString() la byte se convertirá en un int el uso de firmar la extensión (debido a que los valores de byte > 127, serán representados por valores negativos en Java).

    Para evitar esto simplemente utilizar & 0xFF para enmascarar todos, pero el menor de 8 bits como este:

    String binary = Integer.toBinaryString(byteArray[i] & 0xFF);
    Gracias, pero no consigo que funcione. Yo thoought Java no funcionan con bytes sin signo? ¿Cómo puedo convertir de un byte sin signo de regreso a un char?
    Veo, tengo que usar bar[i] = (byte)Integer.parseInt(strar[i], 2);para backconversion. Muchas gracias!

    OriginalEl autor Joachim Sauer

  2. 1

    Para ampliar Joachim del punto de acerca de «ASCII extendido» me gustaría añadir…

    Nota que getBytes() es una transcodificación de operación que convierte los datos de la codificación UTF-16 para la plataforma de codificación predeterminada. La codificación varía de sistema a sistema y a veces incluso entre los usuarios del mismo PC. Esto significa que los resultados no son consistentes en todas las plataformas y si un legado de codificación es el valor por defecto (como en Windows) que los datos pueden ser perdidos.

    Para realizar la operación simétrica, usted necesita para proporcionar una codificación explícita (preferiblemente una codificación Unicode UTF-8 o UTF-16.)

    Charset encoding = Charset.forName("UTF-16");
    byte[] b = s1.getBytes(encoding);
    String s2 = new String(b, encoding);
    assert s1.equals(s2);

    OriginalEl autor McDowell

Dejar respuesta

Please enter your comment!
Please enter your name here