9
votes

Convertir un octet non signé en octet signé

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?


0 commentaires

5 Réponses :


10
votes

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


4 commentaires

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 est non signé.



26
votes

en Java Tous les types primitifs, à l'exception de Char , 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: xxx

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.


6 commentaires

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 est non signé.


@Nayukiminase correct, j'ai oublié ça. Merci de le pointer.



6
votes
public int getUnsignedByte(byte[] bytes, int offset) {
    return (bytes[offset] & 0xFF);
}
should do the work.

0 commentaires

2
votes

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é. xxx

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)

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.

une alternative commune consiste à utiliser un type de données plus grand. Comme int pour stocker des valeurs 0 - 255. Il n'y a pas beaucoup d'inconvénient dans le cas.


0 commentaires

7
votes

Voici comment stocker et convertir une valeur d'octets non signée: xxx pré>

si vous lancez b code> à un int code> Voici ce qui se passe: p> xxx pré>

sortie: p> xxx pré>

Pourquoi cela se produit-il? Les octets sont signés en Java et 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>

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 int code>: p> xxx pré>

Nous pouvons maintenant utiliser l'opérateur Bitwise & CODE> sur "Zero Out" la gauche la plus 24 bits, ne laissant que notre 8 bits d'origine. p> xxx pré>

Notre valeur d'origine de 144 a été restaurée et peut être repliée en toute sécurité à un octet: P>

byte original = (byte) unsignedValue;


0 commentaires