Pregunta

Estoy escribiendo un código en Java (soy bastante nuevo en Java) que he escrito anteriormente en C#. Aquí está el código y el ejemplo en C#.

ushort number = 0xAABB; // 43707
byte[] data = new byte[2];
EndianBitConverter.Big.CopyBytes(number, data, 0); // value[0] = 170, value[1] = 187

Estoy usando Convrter de bit personalizado en .NET ya que es predeterminado a Little Endian. De todos modos, por lo que entiendo sobre Java, si quiero usar el mismo resultado que Byte [] debería esperar que mis valores (170 y 187) sean más pequeños por 128 (byte.max_value + 1) que es (42, 59) - Debido a que .NET y Java tienen un rango diferente para el tipo de byte. Esto es lo que escribí en Java para imitar mi lógica anterior.

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

Sin embargo, cuando llamo al código anterior con

new Ushort(0xAABB).getBytes()

El resultado es [42, -69] en cambio [42, 59]. El último byte es más pequeño por 128 de lo que debería. Realmente necesito algunos consejos sobre cómo hacer esto correctamente y si mi lógica es correcta. También necesito hacer lo mismo para Uint, Ulong, etc., así que necesito entender esto correctamente.

¿Fue útil?

Solución

O no entiendo las razones detrás de las conversiones que está tratando de hacer, o están concebidos erróneamente, lo que significa que no puedo opinar sobre si hay un error en su implementación.

El tipo byte en Java es exactamente lo mismo que el tipo sbyte en C#, para que pueda hacer todas sus pruebas en C# usando sbyte Y asegúrese de que las cosas funcionen correctamente allí antes de portar a Java.

(byte)0xaa = 170
(sbyte)0xaa = -86
(byte)0xbb = 187
(sbyte)0xbb = -69

Entonces, en Java, su matriz de bytes debe ser {-86, -69}.

Otros consejos

No lo probé, pero lo que haría es esto:

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

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top