2011-05-24 127 views
1

可能重複:
Convert 4 bytes to int包裝4個字節爲一個int

我想收拾4個字節爲一個int使用一些在這裏找到了解決方案,但它不」 t似乎適用於我的一個測試。

這是我使用的代碼:

public static int pack(int c1, int c2, int c3, int c4) 
{ 
    return (c1 << 24) | (c2 << 16) | (c3 << 8) | (c4); 
} 

現在,當我使用它像0x34,0x68,0x77,而0×23簡單的東西,我得到我所期望的:0x34687723。但是當我在0xBA,0xAD,0xBE和0xEF上使用它時,我得到了一些解決辦法。有沒有人看到問題可能是什麼?

編輯

上面的代碼是能夠給我我想要的東西,而「錯誤值」我下面提的是十進制的形式表示0xBAADBEEF的另一種方式。

+2

知道你實際獲得的結果是什麼也許有用。 :) – sarnold 2011-05-24 22:26:43

+0

不知何故,我迷路了。你能告訴我你爲什麼每個字節都有這個(0xF​​F&...)嗎?我真的很抱歉,不知何故,目前我沒有得到它......這是漫長的一天。我真的很感謝有人幫助我,在這裏。 – 2011-05-24 22:28:34

+1

@ b.buchhold:我認爲這是確保它們實際上是單字節值。不知道爲什麼參數不僅僅是'byte'類型。 – Ryan 2011-05-24 22:29:52

回答

6

存儲在一個Java int一些只能代表正值高達0x7fffffff(2147483647,Integer.MAX_VALUE),因爲它是一個符號的類型(如所有Java數類型),並且在內部表示中的最顯著位被用作一個符號位。

爲了保持比較大的正數值,你需要使用一個long代替:

public static long pack(int c1, int c2, int c3, int c4) 
{ 
     return ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4)) & 0xffffffffL; 
} 

注意在這是必要的結束的明確long掩碼操作來確保符號擴展不會導致負整數結果從變成負長。

+0

好吧,看起來我的原始代碼給了我正確的答案,在我將其轉換回十六進制之前,它看起來很奇怪。我不知道它爲什麼給出了一個奇怪的值,但使用System.out.printf我能夠確定值是相同的。謝謝您的幫助! – 2011-05-25 01:00:04

+0

@vaxquis我不同意。請注意,您指出的答案採用了OP的原始函數,但是在打印之前使用_unsigned_位操作將返回值提升爲「long」。礦採取替代方法並直接返回「長」。無論如何,儘管語法允許設置最高位的(int)文本,但內部表示仍然會有效地爲負數。無論哪種方式,對於實際上按要求工作並且實際上不是「錯誤」的代碼來說,這是一種苛刻的惡意代碼。 – Alnitak 2016-01-14 20:48:57

+0

你正在分裂頭髮,並將我的答案中的值作爲位模式讀取,而不是「數字」,這是我的意圖。 JVM規範本身說範圍是-2147483648到2147483647.如果在我的答案中需要澄清,那麼僅僅在句子「將值保留在下一位...」(其中I現在已經完成) – Alnitak 2016-01-14 22:04:38

0

您是否得到負數?也許unsigned int或更長的int會更好。

+0

unsigned int?更長的int?我不知道Java有這些類型。 – Kylar 2011-05-24 22:25:03

+0

@Kylar well,'long'是一種「長整型」。當然,不存在無符號類型。 – Alnitak 2011-05-24 22:29:59

0

簽名擴展。在Java中,int是有符號的,所以0xBA < < 24得到不滿。我建議你打包到long的最後四個字節。

long temp = 
    ((0xFF & c1) << 24) | ((0xFF & c2) << 16) | ((0xFF & c3) << 8) | (0xFF & c4); 

return (int)(temp & 0x0FFFFFFFFL); 
+0

這與原始代碼完全相同,只是在長變量上繞行。 (Java不會不高興,它只是創建一個負數,這不是oexcz期望的。) – 2011-05-24 23:19:57

9

你在包裝方法的代碼是正確的,並保留所有位,但由於該結果被存儲在一個有符號整數你會得到一個錯誤的結果,當您嘗試打印它作爲一個int,或當你做算術運算或與它進行比較。

int result = pack(c1, c2, c3, c4); 
System.out.println("result=" + Long.toHexString(result & 0xffffffffL); 

這將int值打印爲無符號整數。

相關問題