将C#代码迁移到Java,无符号短和字节数组转换

时间:2011-11-29 16:05:32

标签: java .net bytearray ushort

我正在编写一段用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)小一点(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等做同样的事情,所以我需要正确理解这一点。

2 个答案:

答案 0 :(得分:5)

要么我不理解您尝试进行的转换背后的原因,要么错误地构思它们,这意味着我无法判断它们的实现是否存在错误。

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

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

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

答案 1 :(得分: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)};

    }
}
相关问题