2013-02-06 110 views
4

嘿,我需要在字節數組中存儲以下十六進制值 - 0xCAFEBABEDEADBEEF。java中的字節數組

所以,我試圖將其保存像這樣。

byte[] v0 = {11001010,11111110,10111010,10111110,11011110,10101101,10111110,11101111}; 

其中11001010是CA二進制,11111110是FE二進制等

但我得到一個錯誤說11001010是一個int,所以我想這是因爲字節簽署了在Java字節,我們只能有+127和-128之間的值。

那麼,有沒有辦法,我可以在java中做到這一點(可能使用無符號字節......如果存在的話!?) 謝謝你們。

+1

這取決於你使用的是什麼版本的Java。對於1.7,您可以用「0b」前綴每個二進制值,否則您將不得不使用十六進制並在每個十六進制值前添加「0x」。 –

回答

9

在號碼前加上0b。您可能還需要轉換爲byte

byte[] v0 = {(byte)0b11001010,(byte)0b11111110,...}; 

0b前綴意味着它是一個二進制數。

如果你希望它是更易於閱讀,你可以使用0x爲十六進制:

byte[] v0 = {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,...}; 

這裏有一個辦法做到這一點(二進制形式),如果您使用的是Java版本低於7:

byte[] v0 = {Byte.parseByte("11001010", 2),...); 
+1

@ user1974753 JLS中的一個小警告。 '0x'和'0b'文字全部被解釋,然後符號擴展爲'int'值。對Doorknob添加的'byte'進行強制轉換隻會從符號擴展的'int'中取最後8位,所以這應該可以正常工作。 – Brian

3

如果寫逐字節,你可以使用:

byte[] v0 = {0b11001010, 0b11111110, 0b10111010, ... } 

byte[] v0 = {0xCA, 0xFE, ... } 
+1

但是byte [] v0 = {0xCA};給我以下錯誤:類型不匹配:不能從int轉換爲字節????? – user1974753

5

字面11001010表示int類型和值11,001,010的小數 - 也就是11個milions和東西。

如果您正在使用Java 7的,您可以定義使用0b前綴二進制文字,如0b11001010。爲了提高可讀性,可以在數值中加下劃線,如0b_1100_1010

但是,請注意,即使這樣的二進制(或十六進制)的文字的類型是靜止int。這與一個事實,即字節一起(不幸)在Java中籤署(因此它們的值在範圍-128 to 127)的結果在與比127較大的值的文字必須手動轉換爲byte問題:

// 0b_1001_0001 or 0x91 is 145 in decimal 
byte b1 = (byte) 0b_1001_0001; 
byte b2 = (byte) 0x91; 

然而,這樣的字節的值將是-111(145 - 256)。要返回無符號值,你需要在模塊(256)手動添加到值:

int i1 = b1 + 256; 
int i2 = b1 & 0xff; 
// both i1 and i2 are 145 

欲瞭解更多信息,請參閱this question

+0

但是byte [] v0 = {0xCA};給我以下錯誤:類型不匹配:不能從int轉換爲字節????? – user1974753

+0

@ user1974753用類似'(byte)0xCA'的字節進行類型轉換。 – Smit

+0

但是,11001010 = 202是十進制的,十六進制的CA,所以我們可以在java中保存一個字節的最大值是+127,那麼有什麼方法可以在一個字節中存儲11001010(十進制202)嗎? – user1974753