Frage

Ich schreibe einen Code in Java (ich bin ziemlich neu in Java), das ich zuvor in C#geschrieben habe. Hier ist der Code und das Beispiel in C#.

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

Ich verwende benutzerdefinierte Bit Convrter in .NET, da es standardmäßig an Little Endian ausfällt. Wie auch immer, nach dem, was ich über Java verstehe, wenn ich das gleiche Ergebnis wie Byte [] verwenden möchte, sollte ich erwarten, dass meine Werte (170 und 187) um 128 (byte.max_value + 1) kleiner sind, das heißt (42, 59) - Aufgrund von .NET und Java haben einen anderen Bereich für Typ -Byte. Folgendes habe ich in Java geschrieben, um meine obige Logik nachzuahmen.

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

Wenn ich jedoch den obigen Code mit aufrufe

new Ushort(0xAABB).getBytes()

Das Ergebnis ist stattdessen [42, -69] [42, 59]. Das letzte Byte ist um 128 kleiner als es sollte. Ich brauche wirklich einige Hinweise darauf, wie man dies richtig macht und ob meine Logik korrekt ist. Ich muss auch das Gleiche für Uint, Ulong und so weiter tun, also muss ich das richtig verstehen.

War es hilfreich?

Lösung

Entweder verstehe ich die Gründe für die Konvertierungen, die Sie versuchen, nicht zu fälschlicherweise konzipiert, was bedeutet, dass ich nicht nachdenken kann, ob ein Fehler in ihrer Implementierung vorliegt.

Der Typ byte In Java ist genau das gleiche wie der Typ sbyte In C# können Sie alle Ihre Tests in C# verwenden sbyte Und stellen Sie sicher, dass die Dinge dort richtig funktionieren, bevor Sie auf Java portieren.

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

In Java sollte Ihr Byte -Array also {-86, -69} sein.

Andere Tipps

Ich habe es nicht getestet, aber was ich tun würde, ist Folgendes:

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

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top