2014-12-02 97 views
1

如何連接兩個字節原語以獲取java中的一個字符?我目前正在嘗試:連接字節以獲得字符

byte a = 0x01; 
byte b = 0x02; 
char c = (char) (a + b); 

它給出0x03。我想要的答案是0x0102。

是否沒有簡單的方法來連接基元?我很驚訝沒有明顯的解決方案,因爲它看起來應該很容易。也許有,我只是沒有看到它。 :p

任何幫助,將不勝感激。 謝謝!

回答

3

通過左移8位並添加。喜歡的東西,

byte a = 0x01; 
byte b = 0x02; 
char c = (char) ((a << 8) + b); 
System.out.println(Integer.toHexString(c)); 

輸出是

102 

正如在評論中指出(由@ChrisMartin),你可以按位或(和我將添加您可能還xor)像

char c = (char) ((a << 8) | b); 

and

char c = (char) ((a << 8)^b); 

全部達到相同的結果。既然你應該Write Dumb Code我建議你使用你發現最容易理解的。

+2

也可能按位或不添加。 '(a << 8)| b' – 2014-12-02 05:12:17

+0

@ChrisMartin編輯。 – 2014-12-02 05:18:21

0

如果你不反對使用第三方庫,番石榴的Chars.fromBytes方法正是這樣做的:

char c = Chars.fromBytes(0x01, 0x02); 
0

正確的表達是((a << 8) | (b & 0xff))

byte a = (byte) 0x81; 
    byte b = (byte) 0x82; 
    char c = (char) ((a << 8) | (b & 0xff)); 

字節,在使用時表達式被提升爲int,並且當這完成時,它被符號擴展。其他答案中的表達式僅在b <= 127時有效。

如果您爲該值添加1個字節,則其值爲-128。 (Java中一個字節的範圍是-128到127),所以當你使用它來存儲無符號數時,你通常必須用b & 0xff屏蔽一個字節。上述表達式中的a不需要這樣做,因爲所有高位都從結果的16位字符中移出。