2011-11-29 66 views
4

我正在用C#编写一段代码(我对Java相当陌生)。以下是C#中的代码和示例。将C#代码迁移到Java,无符号短和字节数组转换

ushort number = 0xAABB; // 43707 
byte[] data = new byte[2]; 
EndianBitConverter.Big.CopyBytes(number, data, 0); // value[0] = 170, value[1] = 187 

我在.NET中使用自定义bit convrter,因为它默认为little endian。无论如何,从我对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等做同样的事情,所以我需要正确理解这一点。

回答

5

要么我不明白你想要做的转换背后的原因,或者他们被错误地构思,这意味着我不能认为他们的实施是否有错误。

类型byte在Java中是完全一样的,如C#类型sbyte,所以你可以使用sbyte做你的测试在C#中,并确保东西移植到Java之前正常工作在那里。

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

所以,在Java中你的字节数组应该是{-86,-69}。

+0

谢谢你,我没想到为sbyte,这就是我所需要的。 –

+0

我觉得有点尴尬,但它服务于我:) –

+0

这是好的,它发生在我们所有人。在C#编程几年之后,有一天我学会了“??”的存在,运营商。 –

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

    } 
} 
+0

这段代码给了我正确的结果,但是我必须接受Mike的回答,因为那样解决了我的整个麻烦。我正在测试并理解从.net到java的字节转换错误....尴尬更合适:) –

相关问题