2009-03-30 26 views
22

Debo convertir un char en un byte o en un conjunto de bytes. En otros idiomas, sé que un char es solo un byte. Sin embargo, mirando la clase de caracteres de Java, su valor mínimo es \ u0000 y su valor máximo es \ uFFFF. Esto hace que parezca que un char tiene 2 bytes de longitud.Representar char como un byte en Java

¿Seré capaz de almacenarlo como un byte o necesito almacenarlo como dos bytes?

Antes de que nadie pregunte, diré que estoy intentando hacer esto porque estoy trabajando bajo una interfaz que espera que mis resultados sean una matriz de bytes. Así que tengo que convertir mi char a uno.

Háganme saber y ayúdenme a entender esto.

Gracias, JBU

Respuesta

34

para convertir caracteres de bytes, es necesario especificar una character encoding. Algunas codificaciones de caracteres usan un byte por carácter, mientras que otras usan dos o más bytes. De hecho, para muchos idiomas, hay demasiados caracteres para codificar con un solo byte.

En Java, la forma más sencilla de convertir de caracteres a bytes es con el método String de la clase getBytes(String encoding). Sin embargo, este método reemplazará silenciosamente los caracteres con & # xfffd; si el personaje no puede ser mapeado bajo la codificación especificada. Si necesita más control, puede configurar un CharsetEncoder para manejar este caso con un error o usar un personaje de reemplazo diferente.

+1

¿Sería correcto usar UTF-8 y almacenar mis caracteres como un solo byte? Estoy pensando que sí, incluso si ese último bit fue un signo de un byte. – jbu

+0

Debe usar la codificación de caracteres requerida por la interfaz en la que está trabajando. – erickson

+1

Para las codificaciones de un solo byte, use la familia ISO-8859 –

0

char en java es un valor sin signo de 16 bits. Si lo que tienes cabe en 7 bits, entonces simplemente hazlo en un byte (por ejemplo, cabe la ASCII).

También puede consultar las API java.nio.charset.

+0

Tiene que caber en 7 bits para trabajar con seguridad. – erickson

+0

sí, no quise entrar en ASCII extendido ... pero actualizaré mi respuesta. – TofuBeer

4

Para ampliar lo que otros dicen, si usted tiene un char que necesita como una matriz de bytes, a continuación, primero se crea una cadena que contiene ese carbón y luego obtener la matriz de bytes de la cadena:

private byte[] charToBytes(final char x) { 
    String temp = new String(new char[] {x}); 
    try { 
    return temp.getBytes("ISO-8859-1"); 
    } catch (UnsupportedEncodingException e) { 
    // Log a complaint 
    return null; 
    } 
} 

Por supuesto, usa el juego de caracteres apropiado. Mucho más eficiente que esto sería comenzar a trabajar con Strings en lugar de tomar un char a la vez, convertirlo a String y luego convertirlo a una matriz de bytes.

8

Una char es de hecho 16 bits en Java (y también es el único tipo sin signo !!).

Si está seguro de que la codificación de sus caracteres es ASCII, entonces puede simplemente descartarlos en un byte (ya que ASCII usa solo los 7 bits inferiores del char).

Si no necesita modificar los caracteres, o entender su significado dentro de una cadena, que sólo puede almacenar caracteres de dos bytes, como:

char[] c = ...; 
byte[] b = new byte[c.length*2]; 
for(int i=0; i<c.length; i++) { 
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
} 

(Puede ser aconsejable sustituir la 2 * por un cambio a la derecha, si la velocidad importa).

Sin embargo, tenga en cuenta que algunos caracteres reales (visualizados) (o, más exactamente, puntos de código Unicode) están escritos en dos caracteres consecutivos. Por lo tanto, cortar entre dos caracteres no garantiza que corte entre caracteres reales.

Si necesita decodificar/codificar o manipular de algún otro modo su matriz de caracteres de una manera consciente de cadenas, debería tratar de decodificar y codificar su matriz de caracteres o Cadena utilizando java.io herramientas, que aseguran la manipulación adecuada del personaje.

+0

En lugar del código que se muestra aquí, especifique "UTF-16" como la codificación de caracteres y use las API de codificación incorporadas. Menos código para que implemente, pruebe y mantenga, y captura el intento más claramente para los lectores del código. – erickson

+0

Y también dos órdenes de magnitud menos en velocidad, debido a la codificación/descodificación, que puede no ser necesaria en esta instancia. – Varkhan

+0

Es solo codificación, y si es más lenta (lo cual dudo), no es un factor de 100. ¿Por qué crees que la codificación UTF-16 está haciendo algo significativamente diferente a tu código? – erickson