Y a-t-il un moyen simple et élégant de convertir une valeur d'octets non signée en une valeur d'octets signée 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 valeur signée de cet int? P>
5 Réponses :
Java n'a pas de valeurs non signées, à l'exception du Char code>. Considérons cet extrait:
byte val = (byte)255;
System.out.println(String.valueOf(val));
Je vois ce que tu veux dire. Un Int à Java est de 32 bits. Les 8 bits les plus bas sont copiés, correct?
Oui. Par "le plus bas", je veux dire les bits avec la valeur positionnelle la plus faible (2 ^ N). Donc, des bits avec des valeurs de position 2 ^ 0 - 2 ^ 7 sont copiés, mais des bits avec des valeurs 2 ^ 8 ou plus sont supprimés. Depuis que c'est Java, vous n'avez pas besoin de vous soucier de l'endansion.
De plus, si vous voulez faire du traitement avec des valeurs non signés, faites simplement ce que @ostefano a écrit - dans tous les cas, Java est de toute façon entier à l'intérieur de l'INT, des shorts et des octets de toute façon.
"Java n'a pas de valeurs non signées.": Pas vrai. Char code> est non signé.
en Java Tous les types primitifs, à l'exception de si vous souhaitez stocker une valeur d'octets non signée dans un type d'octet, vous avez évidemment peut, mais chaque fois que vous devez "traiter", rappelez-vous simplement de la jeter comme indiqué ci-dessus. P> P> Char code>, sont signés. Vous ne pouvez pas avoir un octet non signé.
La seule chose que vous puissiez faire est de lancer l'octet non signé à un int afin que vous puissiez lire sa valeur appropriée:
Quel impact cela aura-t-il? Cela signifie-t-il simplement que si B est un INT 32 bits, puis "et" et "et" avec 11111111 copiera les 8 bits les plus bas? Merci
Désolé, j'ai oublié de mentionner que "B" est un octet non signé enregistré dans un type d'octet signé (le seul disponible). Vous pouvez toujours stocker des octets non signés dans des types d'octets signés, mais vous devez effectuer la conversion mentionnée ci-dessus chaque fois que vous devez faire des mathématiques. Si vous avez juste besoin de vérifier ses bits, vous n'avez pas besoin de cela.
Je ne suis toujours pas avec toi à ce sujet. Pourquoi vous et l'octet B avec 0xFF?
Cela signifie que vous couvrez la valeur à un autre type (vous ne pouvez pas attribuer 0XFF à une variable d'octets en Java) et jeter tous les bits mais les 8 à droite (où la valeur est stockée).
"En Java, tous les types primitifs sont signés.": Pas vrai. Char code> est non signé.
@Nayukiminase correct, j'ai oublié ça. Merci de le pointer.
public int getUnsignedByte(byte[] bytes, int offset) { return (bytes[offset] & 0xFF); } should do the work.
Java ne prend en charge que des octets signés, donc chaque fois que vous passez une valeur dans un octet, c'est supposé être signé. Cependant, si vous souhaitez stocker un octet non signé, vous devez gérer cette toi-même. (c.-à-d. Java ne le supporte pas, mais vous pouvez le faire) P> pour des opérations comme +, -, *, <<, >>>, == ,! =, ~ Vous n'avez pas besoin de changer quoi que ce soit, pour des opérations telles que <,> Vous devez avoir des ajustements mineurs et pour des opérations telles que /,% Vous devez utiliser un type de données plus grand. p> une alternative commune consiste à utiliser un type de données plus grand. Comme int code> pour stocker des valeurs 0 - 255. Il n'y a pas beaucoup d'inconvénient dans le cas. P> p>
Voici comment stocker et convertir une valeur d'octets non signée: si vous lancez sortie: p> Pourquoi cela se produit-il? Les octets sont signés en Java et Alors, comment pouvons-nous revenir de -112 à la valeur correcte de 144? Nous avons besoin d'un Bitmask , que nous pouvons créer avec un Nous pouvons maintenant utiliser l'opérateur Bitwise Notre valeur d'origine de 144 a été restaurée et peut être repliée en toute sécurité à un octet: P> b code> à un
int code> Voici ce qui se passe: p>
B CODE> est négatif afin que l'opération de distribution remplit le Int résultant avec 1s de la gauche. Plus sur les formats de données Java . P>
int code>: p>
& CODE> sur "Zero Out" la gauche la plus 24 bits, ne laissant que notre 8 bits d'origine. p>
byte original = (byte) unsignedValue;