2011-11-29 57 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的字節轉換錯誤....尷尬更合適:) –

相關問題