2017-12-18 177 views
1

我得到兩個java字節作爲輸入,共同表示一個16位有符號整數。我需要將它轉換爲一個單一的java整數(當然,簽名)。我想出了一個「醜陋的」解決方案,其中包括轉換爲int,然後轉換爲short,然後轉換爲int。有更短更優雅的方式嗎? 我的代碼如下:如何簡化這種二進制到java類型的代碼?

public int convert(byte b1, byte b2){ 
    int i1 = (int) (((b2 << 8) + (b1 & 0xFF)) & 0x0000FFFF); 
    short s1 = (short) i1; 
    int i2 = (int) s1; 
    return i2; 
} 
+0

'return(short)i1;'會更簡單,利用自動加寬。 –

+0

但是我最終必須得到一個int(不是簡短的)(出於傳統的原因)。 – alebo611

+0

'return(short)i1;'與您最後3行相同。勾小指。 –

回答

1

這似乎符合您轉換器 - 不能確定它是簡單,但它肯定是少冗長。

public int convert2(byte b1, byte b2) { 
    return new BigInteger(new byte[]{b2,b1}).intValue(); 
} 
+0

有趣的解決方案,將嘗試。我忘了提及表演並不重要。我需要實時轉換這些數字的噸數。 – alebo611

1

以下是等效的:

return (short) ((b2 << 8) | (b1 & 0xFF)); 

byte具有足夠小的範圍內,這是實際中測試該等價爲b1b2所有可能的值:

byte b1 = Byte.MIN_VALUE; 
do { 
    byte b2 = Byte.MIN_VALUE; 
    do { 
    assertEquals(convert(b1, b2), convertEquivalent(b1, b2)); 
    } while (b2++ != Byte.MAX_VALUE); 
} while (b1++ != Byte.MAX_VALUE); 

Ideone demo

0

@AndTurner可能是您尋求的解決方案。

但是,如果涉及字節數組或某個文件通道(存儲器映射文件),輸入流,則可以使用ByteBuffer。

byte[] bytes = ... 
ByteBuffer buf = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); 
... 
short n = buf.readShort(); // Sequential 
short m = buf.readShort(354L); // Direct access