2012-03-06 50 views
0

好吧,所以我已經搜索和搜索,沒有任何工作... 我有這個int數組,每個int只佔用低位字節。舉例來說,我有Java - 寫一個int的第一個字節

data[0] = Ox52 
data[1] = Oxe4 
data[2] = Ox18 
data[3] = Oxcb 

我想要的標準輸出中只包含那些字節(或者換句話說,如果我寫這篇文章的一個文件,我檢查用十六進制編輯器中的文件,我應該看到):

52e418cb

我該怎麼做?

謝謝您的幫助

+0

爲什麼不使用'byte'數組? – moooeeeep 2012-03-06 21:27:25

+0

因爲我正在嘗試爲我的個人使用調整AES實現,並且它使用int數組。我仍然無法使它工作,我有一個16 int(因此,我應該得到16個字節)的數組,因此最終得到24個字節。< – Totor 2012-03-06 21:38:50

+0

所以你的實際問題是如何寫入二進制數據到標準輸出? – moooeeeep 2012-03-06 21:42:47

回答

0

下似乎很好地工作。我正在使用OutputStream.write(int)方法。

int[] ints = new int[] { 0x52, 0xe4, 0x18, 0xcb }; 
FileOutputStream os = new FileOutputStream(new File("/tmp/x")); 
for (int i : ints) { 
    os.write(i); 
} 
os.close(); 

結果:

> hexdump /tmp/x 
0000000 52 e4 18 cb          
+0

它確實有用,非常感謝! – Totor 2012-03-06 21:41:19

0

只是轉移和在一起,或者他們將其寫入到文件/輸出前:

(data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3] 
+0

該解決方案是否也適用於64位體系結構? – Sid 2012-03-06 21:26:29

+1

你應該添加一些'&0xff'掩碼。以防萬一...... – moooeeeep 2012-03-06 21:26:36

+4

@Sid無論您在哪種架構下,Java int都始終爲32位。無論如何,這個概念很容易擴展到64位。 – Taymon 2012-03-06 21:27:41

1

這樣做的正確的方法是根據它們的期望的位置的字節數到移位和然後使用OR運算符拼接起來。但是,在移位之前,您還應該在字節的低8位執行位掩碼。這是需要的,因爲一個字節首先被轉換爲一個int(在轉換完成之前)。這沒什麼大不了的,但是當最高位爲1(即:該字節爲負數)時,您的整數也會變爲負數,這會導致所有前導位設置爲1.

因此:

(byte) 10000000 = (int) 11111111 11111111 11111111 10000000 

在OR運算符中使用負的int值會導致錯誤的結果。所以,工作線是這樣的:

((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF)