我正在用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

我在.NET中使用自定义位转换器,因为它默认为Little Endian。无论如何,据我了解Java,如果我想使用与字节[]相同的结果,我应该期望我的值(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