Мигрирование C# Code на Java, неподписанный короткий и байтовый массив преобразование

StackOverflow https://stackoverflow.com/questions/8313899

  •  25-10-2019
  •  | 
  •  

Вопрос

Я пишу кусок кода в Java (я довольно новичок в Java), который я ранее писал в C#. Вот код и пример в C#.

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

Я использую Custom Bit Convrter в .NET, так как он по умолчанию в Little Endian. В любом случае, из того, что я понимаю в Java, если я хочу использовать тот же результат, что и Byte [], я должен ожидать, что мои значения (170 и 187) будут меньше на 128 (byte.max_value + 1) это (42, 59) - Из -за .NET и Java имеют различный диапазон для типа байта. Вот что я написал на Java, чтобы имитировать мою вышеупомянутую логику.

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

Однако, когда я называю вышеуказанный код с

new Ushort(0xAABB).getBytes()

Результат [42, -69] вместо [42, 59]. Последний байт меньше к 128, чем должен. Мне действительно нужны некоторые указатели о том, как сделать это правильно, и если моя логика верна. Мне также нужно сделать то же самое для Uint, Ulong и так далее, поэтому мне нужно правильно понять это.

Это было полезно?

Решение

Либо я не понимаю причин конверсий, которые вы пытаетесь сделать, или они ошибочно задуманы, что означает, что я не могу высказать мнение о том, есть ли ошибка в их реализации.

Тип byte на Java то же самое, что и тип sbyte в C#, так что вы можете провести все свои тестирование в C#, используя sbyte И убедитесь, что там все работает правильно, прежде чем переносить на Java.

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

Итак, в Java ваш байт -массив должен быть {-86, -69}.

Другие советы

Я не проверял это, но я бы сделал это:

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

    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top