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.

Était-ce utile?

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

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top