2009-03-30 17 views
22

Devo convertire un carattere in un byte o un array di byte. In altre lingue, so che un char è solo un byte. Tuttavia, guardando la classe Java Character, il suo valore minimo è \ u0000 e il suo valore massimo è \ uFFFF. Questo fa sembrare che un char sia lungo 2 byte.Rappresentare char come byte in Java

Sarà possibile memorizzarlo come un byte o è necessario memorizzarlo come due byte?

Prima che qualcuno chieda, dirò che sto cercando di farlo perché sto lavorando sotto un'interfaccia che si aspetta che i miei risultati siano un array di byte. Quindi devo convertire il mio char in uno.

Per favore fatemi sapere e aiutatemi a capire questo.

Grazie, JBU

risposta

34

per convertire i caratteri di byte, è necessario specificare un character encoding. Alcune codifiche dei caratteri usano un byte per carattere, mentre altri usano due o più byte. In effetti, in molte lingue ci sono troppi caratteri da codificare con un singolo byte.

In Java, il modo più semplice per convertire da caratteri a byte è con il metodo getBytes(String encoding) della classe String. Tuttavia, questo metodo sostituirà automaticamente i caratteri con & # xfffd; se il personaggio non può essere mappato sotto la codifica specificata. Se è necessario un maggiore controllo, è possibile configurare un CharsetEncoder per gestire questo caso con un errore o utilizzare un carattere di sostituzione diverso.

+1

utilizza UTF-8 e memorizza i miei caratteri come un singolo byte ok? Sto pensando di sì, anche se quell'ultimo bit era un bit di segno per un byte. – jbu

+0

È necessario utilizzare la codifica dei caratteri richiesta dall'interfaccia sotto cui si sta lavorando. – erickson

+1

Per le codifiche a byte singolo utilizzare la famiglia ISO-8859 –

0

char in java è un valore a 16 bit senza segno. Se quello che hai si adatta in 7 bit, basta fare il cast su un byte (ad esempio, ASCII andrà bene).

È possibile eseguire il checkout anche delle API java.nio.charset.

+0

Deve adattarsi a 7 bit per funzionare in sicurezza. – erickson

+0

sì, non volevo entrare in ASCII esteso ... ma aggiornerò la mia risposta. – TofuBeer

4

Per estendere ciò che gli altri hanno da dire, se si dispone di un carattere che è necessario come un array di byte, quindi in primo luogo creare una stringa contenente che char e quindi ottenere l'array di byte dalla stringa:

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; 
    } 
} 

Ovviamente, usa il set di caratteri appropriato. Molto più efficiente sarebbe iniziare a lavorare con le stringhe piuttosto che prendere un char alla volta, convertirlo in una stringa, quindi convertirlo in un array di byte.

8

Un carattere è effettivamente 16 bit in Java (ed è anche l'unico tipo senza segno !!).

Se sei sicuro che la codifica dei tuoi caratteri sia ASCII, puoi semplicemente lanciarli su un byte (dato che ASCII usa solo i 7 bit inferiori del char).

Se non è necessario modificare i caratteri, o capire loro significato all'interno di una stringa, si può semplicemente memorizzare caratteri su due byte, come:

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); 
} 

(Può essere consigliabile sostituire la 2 * con un giusto spostamento, se la velocità è importante).

Si noti tuttavia che alcuni caratteri (visualizzati) effettivi (o, più precisamente, punti codice Unicode) sono scritti su due caratteri consecutivi. Quindi tagliare tra due caratteri non garantisce di tagliare tra i personaggi reali.

Se è necessario decodificare/codificare o manipolare in altro modo il proprio array di caratteri in modo sensibile alla stringa, è consigliabile provare a decodificare e codificare il proprio array di caratteri o String utilizzando java.strumenti io, che garantiscono una corretta manipolazione del personaggio.

+0

Piuttosto che il codice mostrato qui, specificare "UTF-16" come codifica dei caratteri e utilizzare le API di codifica incorporate. Meno codice da implementare, testare e mantenere e catturare più chiaramente l'intento per i lettori del codice. – erickson

+0

E anche due ordini di grandezza in meno in velocità, a causa della codifica/decodifica, che potrebbe non essere necessaria in questo caso. – Varkhan

+0

È solo codifica, e se è più lento (cosa di cui dubito), non è un fattore di 100. Perché pensi che la codifica UTF-16 stia facendo qualcosa di significativamente diverso dal tuo codice? – erickson