【问题标题】:Migrating C# code to Java, unsigned short and byte array conversion将 C# 代码迁移到 Java,无符号短和字节数组转换
【发布时间】:2011-11-29 16:05:31
【问题描述】:

我正在用 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 .net bytearray ushort


    【解决方案1】:

    要么我不明白你试图做的转换背后的原因,要么它们被错误地构思,这意味着我无法就它们的实施是否存在错误发表意见。

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

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

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

    【讨论】:

    • 谢谢,我没有想到 sbyte,这就是我所需要的。
    • 没关系,这发生在我们所有人身上。经过几年的 C# 编程,有一天我了解到“??”的存在。运算符。
    【解决方案2】:

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

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

    【讨论】:

    • 这段代码给了我正确的结果,但是我必须接受迈克的回答,因为那种解决了我的整个麻烦。我正在测试和理解从.net到java的字节转换不正确....尴尬更合适:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多