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

我正在用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等做同样的事情,所以我需要正确理解这一点.

解决方法:

要么我不理解你试图做的转换背后的原因,要么他们被错误地构思,这意味着我不能讨论他们的实现是否存在错误.

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

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

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

上一篇:c# – 为什么’int’可以被视为’ushort’而不是作为扩展方法中的参数传递时,它是什么?它是一个优雅的解决方案?


下一篇:C# 同步更新系统时间