web-dev-qa-db-fra.com

Représenter char comme un octet dans Java

Je dois convertir un caractère en un octet ou un tableau d'octets. Dans d'autres langues, je sais qu'un caractère n'est qu'un seul octet. Cependant, en regardant la classe Java Character, sa valeur minimale est\u0000 et sa valeur maximale est\uFFFF. Cela donne l'impression qu'un caractère fait 2 octets de long.

Vais-je pouvoir le stocker sous forme d'octet ou dois-je le stocker sur deux octets?

Avant que quiconque ne demande, je dirai que j'essaie de le faire parce que je travaille sous une interface qui s'attend à ce que mes résultats soient un tableau d'octets. Je dois donc convertir mon personnage en un seul.

S'il vous plaît laissez-moi savoir et aidez-moi à comprendre cela.

Merci, jbu

24
jbu

Pour convertir des caractères en octets, vous devez spécifier un encodage de caractères . Certains encodages de caractères utilisent un octet par caractère, tandis que d'autres utilisent deux octets ou plus. En fait, pour de nombreuses langues, il y a beaucoup trop de caractères à encoder avec un seul octet.

En Java, le moyen le plus simple de convertir des caractères en octets est d'utiliser la méthode getBytes(Charset) de la classe String. (La classe StandardCharsets définit certains encodages courants.) Cependant, cette méthode remplacera silencieusement les caractères par � si le caractère ne peut pas être mappé sous l'encodage spécifié. Si vous avez besoin de plus de contrôle, vous pouvez configurer un CharsetEncoder pour gérer ce cas avec une erreur ou utiliser un caractère de remplacement différent.

35
erickson

Un caractère est en effet 16 bits dans Java (et est également le seul type non signé !!).

Si vous êtes sûr que le codage de vos caractères est ASCII, vous pouvez simplement les jeter sur un octet (puisque ASCII utilise uniquement les 7 bits inférieurs du caractère).

Si vous n'avez pas besoin de modifier les caractères ou de comprendre leur signification dans une chaîne, vous pouvez simplement stocker des caractères sur deux octets, comme:

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

(Il peut être conseillé de remplacer le 2 * par un décalage à droite, si la vitesse compte).

Notez cependant que certains caractères réels (affichés) (ou, plus précisément, des points de code Unicode) sont écrits sur deux caractères consécutifs. Ainsi, couper entre deux caractères ne garantit pas que vous coupez entre les caractères réels.

Si vous avez besoin de décoder/encoder ou de manipuler votre tableau de caractères d'une manière sensible à la chaîne, vous devriez plutôt essayer de décoder et encoder votre tableau de caractères ou votre chaîne à l'aide des outils Java.io, qui garantissent une manipulation correcte des caractères.

8
Varkhan

Pour étendre ce que les autres disent, si vous avez un caractère dont vous avez besoin en tant que tableau d'octets, vous créez d'abord une chaîne contenant ce caractère, puis obtenez le tableau d'octets à partir de la chaîne:

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

Bien sûr, utilisez le jeu de caractères approprié. Beaucoup plus efficace que ce serait de commencer à travailler avec des chaînes plutôt que de prendre un caractère à la fois, de le convertir en chaîne, puis de le convertir en un tableau d'octets.

4
Eddie

char in Java est une valeur non signée de 16 bits. Si ce que vous avez tient sur 7 bits, faites simplement le transtypage en octet (par exemple ASCII en forme).

Vous pouvez également consulter les API Java.nio.charset .

0
TofuBeer