Java 11 Cuerdas compacto magia detrás char [] para byte []

chiperortiz:

He estado leyendo acerca de la codificación Unicode de Java 9 Cuerdas compactos en los últimos dos días me estoy haciendo bastante bien. Pero hay algo que no entiendo.

Sobre el tipo de datos byte

1). Es un almacenamiento de 8 bits oscila -128-127

preguntas

1). ¿Por qué Java no puso en práctica como si fuera de char sin signo de 16 bits? Me refiero a lo que sería en un rango de 0,256 a causa de 0 a 127 solamente puedo sostener un valor ASCII, pero ¿qué pasaría si fijo el valor 200 al ASCII extendido desbordaría a -56.

2). ¿El valor negativo significar algo quiero decir que tengo probar un ejemplo sencillo el uso de Java 11

final char value = (char)200;//in byte would overflow
final String stringValue = new String(new char[]{value});
System.out.println(stringValue);//THE SAME VALUE OF JAVA 8

He comprobado la variable String.value y veo una matriz de bytes de

System.out.println(value[0]);//-56

Las mismas preguntas como antes de que surjan hace la media -56 algo que me refiero a la (valor negativo) en otros idiomas se detecta esta desbordamiento para volver al valor 200? ¿Cómo puede saber que Java -56 valor es el mismo que 200 en una charla.

Tengo tratar ejemplos más duros como punto de código 128048 y veo en la variable String.value una matriz de bytes de este tipo.

0 = 61 
1 = -40
2 = 48
3 = -36

Sé que este punto de código ocupa 4 bytes, pero lo entiendo cómo se transforma char [] para byte [] , pero no sé cómo manejar esta cadena de datos byte [].

Lo siento si esta pregunta es simple y siento tener que escribir Inglés no es mi idioma natural gracias mucho.

Holger:

¿Por qué Java no puso en práctica como si fuera de char sin signo de 16 bits? Me refiero a lo que sería en un rango de 0,256 a causa de 0 a 127 solamente puedo sostener un valor ASCII, pero ¿qué pasaría si fijo el valor 200 al ASCII extendido desbordaría a -56.

tipos de datos primitivos de Java se resolvieron con Java 1.0 hace un cuarto de siglo. Las cadenas compactos se introdujeron en Java 9, hace menos de dos años. Esta nueva característica, que no es más que un detalle de implementación, no justifica los cambios fundamentales en el sistema de tipos de Java.

Además de eso, usted está buscando en una interpretación de los datos almacenados en un byte. Por el bien de representar ISO-Latin-1 unidades, es totalmente irrelevante si la interpretación de los mismos datos como Java incorporado en firmada byteresultaría en sentido positivo o número negativo.

Del mismo modo API de E / S de Java permite la lectura de un archivo en una byte[]matriz y escritura byte[]matrices de nuevo a los archivos y estas dos operaciones ya son suficientes para copiar un archivo sin pérdidas, con independencia de su formato de archivo que sea pertinente a la hora de interpretar su contenido.

Por lo tanto, las siguientes obras desde Java 1.1:

byte[] bytes = "È".getBytes("iso-8859-1");
System.out.println(bytes[0]);
System.out.println(bytes[0] & 0xff);
-56
200

Los dos números, -56y 200son sólo diferentes interpretaciones del patrón de bits 11001000mientras que el iso-latin-1 interpretación de una byteque contiene el patrón de bits 11001000es el carácter È.

Un charvalor es también sólo una interpretación de una cantidad de dos bytes, es decir, como unidad de código UTF-16. Del mismo modo, una char[]matriz es una secuencia de bytes en la memoria del ordenador con una interpretación estándar.

También podemos interpretar otras secuencias de bytes de esta manera.

StringBuilder sb = new StringBuilder().appendCodePoint(128048);
byte[] array = new byte[4];
StandardCharsets.UTF_16LE.newEncoder()
    .encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
System.out.println(Arrays.toString(array));

imprimirá el valor que has visto, [61, -40, 48, -36].

La ventaja de usar una byte[]matriz dentro de la Stringclase es, que ahora, la interpretación puede ser elegido, para usar iso-latin-1 cuando todos los caracteres son representable con esta codificación o UTF-16 lo contrario.

Las posibles interpretaciones numéricas son irrelevantes para la cadena. Sin embargo, cuando se pregunta “¿Cómo puede saber que Java -56 valor es el mismo que el 200”, usted debe preguntarse, ¿cómo sabe que el patrón de bits 11001000de un bytees -56, en primer lugar?

System.out.println(value[0]);

lleva una operación realmente caro, en comparación con la aritmética ordenador ordinario, la conversión de un byte(o una int) a una String. Esta operación de conversión es a menudo pasado por alto, ya que se ha definido como la forma por defecto de impresión de una byte, pero no es más natural que una conversión a una Stringinterpretación del valor como una cantidad sin signo. Para leer más, recomiendo el complemento a dos .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=224866&siteId=1
Recomendado
Clasificación