4

我正在用 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 中使用自定义位转换器,因为它默认为小端。无论如何,根据我对 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 等做同样的事情,所以我需要正确理解这一点。

4

2 回答 2

5

要么我不理解您尝试进行的转换背后的原因,要么它们被错误地构思,这意味着我无法就其实施是否存在错误发表意见。

java 中的类型与 C#byte中的类型完全相同sbyte,因此您可以使用 C# 进行所有测试,sbyte并确保在移植到 java 之前一切正常。

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

因此,在 Java 中,您的字节数组应该是 { -86, -69 }。

于 2011-11-29T16:27:14.123 回答
3

我没有测试它,但我会做的是:

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

    }
}
于 2011-11-29T16:27:48.433 回答