59 votes

Quel est le meilleur moyen de contourner le fait que TOUS les octets Java sont signés?

En Java, un octet non signé n'existe pas.

Lorsque vous travaillez avec un code de bas niveau, vous devez parfois utiliser des octets dont les valeurs non signées sont supérieures à 128, ce qui oblige Java à les interpréter comme un nombre négatif, car le MSB est utilisé pour la signature.

Quel est un bon moyen de contourner ce problème? (Dire qu'il ne faut pas utiliser Java n'est pas une option.)

82voto

ejack Points 882

@pauldoo

Il est en fait possible de supprimer l’énoncé if et l’ajout si vous le faites comme ceci.

 byte[] foobar = ..;
int value = (foobar[10] & 0xff);
 

De cette façon, Java n'interprète pas l'octet comme un nombre négatif et retourne également le bit de signe sur l'entier.

20voto

pauldoo Points 5020

Lorsque vous lisez une valeur unique du tableau, copiez-la dans quelque chose comme un court ou un int et convertissez manuellement le nombre négatif en valeur positive, comme il se doit.

 byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
 

Vous pouvez effectuer une conversion similaire lors de l'écriture dans le tableau.

1voto

izb Points 12736

Utiliser ints est généralement préférable à short, car java utilise quand même des valeurs 32 bits en interne (même pour les octets, sauf dans un tableau). Son utilisation évite ainsi les conversions inutiles en / depuis les valeurs courtes du bytecode.

0voto

stimms Points 14986

Probablement votre meilleur pari est d'utiliser un entier plutôt que d'un octet. Il a la salle pour permettre un nombre supérieur à 128 sans la contrainte d'avoir à créer un objet spécial pour remplacer octet.

C'est également suggéré par des gens plus intelligents que moi (tout le monde)

0voto

martinatime Points 1863

La meilleure façon de faire de manipulation de bits/octets non signés est grâce à l'aide d' ints. Même s'ils sont signés, ils ont beaucoup de rechange bits (32 au total) à traiter comme un octet non signé. Aussi, tous les opérateurs mathématiques convertira petite précision fixe numéros pour int. Exemple:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

De ce fait, il est préférable de simplement coller avec entier et d'un masque pour obtenir les bits qui vous intéressent. Exemple:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

Voici quelques infos sur les types primitifs de Java http://mindprod.com/jgloss/primitive.html

Une dernière remarque triviale, il y a un unsigned précision fixe nombre de Java. C'est le char primitive.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X