Le compilateur semble être d'accord avec cela (valeurs hexadécimales à un chiffre uniquement):
byte[] rawbytes={0xa, 0x2, 0xf};
Mais pas ça:
byte[] rawbytes={0xa, 0x2, 0xff};
J'obtiens une erreur "Perte de précision possible trouvée: int requis: octet"?
Qu'est-ce que je fais mal - ou les nombres hexadécimaux à un chiffre sont-ils un cas spécial?
Java 1.5.x.
Comme l'autre a déjà répondu, l'octet est un type signé en Java. La plage va de -128 à 127 inclus. Donc 0xff est égal à -0x01. Vous pouvez utiliser 0xff au lieu de -0x01 si vous ajoutez une conversion manuelle:
byte[] rawbytes={0xa, 0x2, (byte) 0xff};
Il y a une autre possibilité en déclarant une fonction d'assistance avec arguments variables. Cela peut être préférable si vous devez déclarer des tableaux à plusieurs octets.
Exemple de code
public static byte[] toBytes(int... ints) { // helper function
byte[] result = new byte[ints.length];
for (int i = 0; i < ints.length; i++) {
result[i] = (byte) ints[i];
}
return result;
}
public static void main(String... args) {
byte[] rawbytes = toBytes(0xff, 0xfe); // using the helper
for (int i = 0; i < rawbytes.length; i++) {
System.out.println(rawbytes[i]); // show it works
}
}
byte
est signé et 0xff = 255
C est trop gros. La plage valide est (-128 .. 127).
Exemple de code:
public static void main(String[] args) {
byte b = (byte) 0xff; // = -1
int i = b; // = -1
int j = b & 0xff; // = 255
System.out.printf("b=%s, i=%s, j=%s", b,i,j);
}
"0xFF" est un littéral int
pour la valeur décimale 255, qui n'est pas représentable comme un octet.
Pour l'instant, vous devrez le convertir en byte
pour dire au compilateur que vous voulez vraiment dire -1, comme ceci:
byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };
Il a été proposé d'ajouter une nouvelle syntaxe littérale d'octet (suffixe y
ou Y
) à Java 7. Ensuite, vous auriez pu écrire:
byte[] rawbytes = { 0xA, 0x2, 0xFFy };
Cependant, cette proposition n'a pas été incluse dans la "proposition omnibus pour des littéraux intégraux améliorés", donc nous sommes coincés avec le casting pour toujours.