Migration du code C # à Java, la conversion de court non signé et tableau d'octets
Question
Je suis en train d'écrire un morceau de code en Java (je suis assez nouveau pour Java) que je l'ai déjà écrit en C #. Voici le code et l'exemple en C #.
ushort number = 0xAABB; // 43707
byte[] data = new byte[2];
EndianBitConverter.Big.CopyBytes(number, data, 0); // value[0] = 170, value[1] = 187
J'utilise convrter bits personnalisé dans .NET car la valeur par défaut peu endian. Quoi qu'il en soit, d'après ce que je comprends java, si je veux utiliser le même résultat que l'octet [] J'attends mes valeurs (170 et 187) pour être plus petite de 128 (Byte.MAX_VALUE + 1) qui est (42, 59) - en raison de .NET et Java ayant différentes gammes pour l'octet de type. Voici ce que je l'ai écrit en Java pour mimer ma logique ci-dessus.
public class Ushort {
private int value = 0;
public Ushort(int i) {
value = i - (Short.MAX_VALUE + 1);
}
public int get() {
return value;
}
public byte[] getBytes() {
byte[] result = new byte[]{
(byte) (value >>> 24),
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) value};
return new byte[]{result[2], result[3]};
}
}
Toutefois, lorsque j'appelle le code ci-dessus avec
new Ushort(0xAABB).getBytes()
Le résultat est [42, -69] à la place [42, 59]. Le dernier octet est plus petit de 128 que prévu. J'ai vraiment besoin de quelques conseils sur la façon de le faire correctement et si ma logique est correcte. Je dois aussi faire la même chose pour uint, ulong et ainsi de suite, donc je dois comprendre correctement.
La solution
Soit je ne comprends pas les raisons derrière les conversions que vous essayez de faire, ou ils sont mal conçues, ce qui signifie que je ne peux pas opine de savoir s'il y a une erreur dans leur mise en œuvre.
Le type byte
en java est sbyte
exactement le même que le type en C #, de sorte que vous pouvez faire vos tests en C # en utilisant sbyte
et assurer que les choses fonctionnent correctement avant il portage java.
(byte)0xaa = 170
(sbyte)0xaa = -86
(byte)0xbb = 187
(sbyte)0xbb = -69
Ainsi, en Java votre tableau d'octets doit être {-86, -69}.
Autres conseils
Je n'ai pas testé, mais ce que je ferais est ceci:
public class Ushort {
private int value = 0;
public Ushort(int i) { // Changed
if (i > 0xFFFF || i < -(0xFFFF))
throws IllegalArgumentException("integer overflow")
value = i;
}
public int get() {
return value;
}
public byte[] getBytes() { // Changed! (Use & 0xFF)
return new byte[]{
(byte) ((value >>> 8) & 0xFF),
(byte) (value & 0xFF)};
}
}