Convertir unsigned byte à byte signé
Est facile et élégante façon de convertir un octet non signé valeur d'un octet signé valeur en java? Par exemple, si tout ce que j'ai est la valeur int 240 (en binaire (24 bits + 11110000) = 32bits), comment puis-je obtenir la signature de la valeur de cette int?
OriginalL'auteur Joeblackdev | 2011-08-06
Vous devez vous connecter pour publier un commentaire.
Java n'a pas de valeurs non signées, sauf pour
char
. Considérons cet extrait:Le résultat sera -1, parce que le plus bas de 8 bits ai copié sur la variable d'octet.
Oui. Par "plus bas", je veux dire les bits avec il a la plus faible valeur de position (2^n). Si les bits de position avec des valeurs de 2^0 - 2^7 sont copiés, mais bits avec des valeurs de 2^8 ou plus sont éliminés. Puisque c'est de java, vous n'avez pas besoin de s'inquiéter à propos de l'endianness.
Aussi, si vous voulez faire un traitement avec des valeurs non signées, il suffit de faire ce que @ostefano a écrit: - dans tous les cas, java ne l'arithmétique des nombres entiers en interne pour les entiers, les shorts et les octets de toute façon.
"Java n'a pas de valeurs non signées.": Pas vrai.
char
est pas signé.OriginalL'auteur Tassos Bassoukos
En Java tous les types primitifs, sauf pour
char
, sont signés. Vous ne pouvez pas avoir un octet non signé.La seule chose que vous pouvez faire est de jeter les unsigned byte int de sorte que vous pouvez lire sa valeur propre:
Si vous souhaitez stocker un octet non signé valeur d'un octet de type, de toute évidence vous pouvez, mais à chaque fois que vous avez besoin de "processus", il suffit de se rappeler de le jeter à nouveau comme l'ont montré ci-dessus.
Désolé, j'ai oublié de mentionner que "b" est un octet non signé sauvegardé dans un octet signé type (le seul disponible). Vous pouvez toujours stocker des octets non signés dans l'octet signé types, mais vous avez besoin pour effectuer le ci-dessus mentionné de conversion à chaque fois que vous avez besoin de faire quelques calculs. Si vous avez juste besoin de vérifier le nombre de bits que vous n'en avez pas besoin.
Je ne suis pas encore avec vous sur ce point. Pourquoi avez-vous et le byte b avec 0xff?
Cela signifie que vous sortie la valeur d'un autre type (vous ne pouvez pas affecter de 0xFF à un octet variable en java), et de jeter tous les morceaux, mais le 8 le plus à droite (où la valeur est stockée).
"En Java tous les types primitifs sont signés.": Pas vrai.
char
est pas signé.OriginalL'auteur ostefano
devrait faire le travail.
OriginalL'auteur omnomnom
Voici comment les stocker et de les convertir un octet non signé valeur:
Si vous lancez
b
à unint
voici ce qui arrive:De sortie:
Pourquoi cela se produit? Les octets sont signés en Java, et
b
est négatif, alors l'opération de cast remplit l'résultant de type int, avec 1s de la gauche. Plus sur java formats de données.Alors, comment pouvons-nous obtenir de retour de -112 à la valeur correcte de 144? Nous avons besoin d'un 32-bit masque de bits, que l'on peut créer avec un
int
:Maintenant, nous pouvons utiliser le bit à bit
&
opérateur de "zéro" à " le plus à gauche 24 bits, ne laissant que notre origine 8 bits.Notre valeur d'origine de 144 a été restauré et peut être en toute sécurité rejetés sur un octet:
OriginalL'auteur donturner
Java ne supporte signé octets donc à chaque fois que vous placez une valeur d'un octet, son supposé être signé.
Toutefois, si vous souhaitez stocker un octet non signé, vous devez gérer vous-même. (c'est à dire de Java n'est pas prise en charge, mais vous pouvez le faire)
Pour des opérations comme +, -, *, <<, >>>, ==, !=, ~ vous n'avez pas besoin de changer quoi que ce soit, Pour des opérations comme les <, > vous avez besoin de faire des ajustements mineurs, et pour des opérations comme /, %, vous devez utiliser un plus grand type de données.
Une alternative est d'utiliser un plus grand type de données comme
int
pour stocker des valeurs de 0 à 255. Il n'y a pas beaucoup d'inconvénient à le faire.OriginalL'auteur Peter Lawrey