2015-06-16 84 views
1

我們有一個文件,其中包含特定格式的字節數組,例如標題,然後是數據。這個文件是由另一個java程序生成的,然後我們通過另一個java程序以與它相同的格式讀取同一個文件。如何將負字節值轉換爲short或integer?

這是使該文件的程序,填充lengthOfKey爲字節這是正確的因爲這是我們需要的,如下圖所示。現在

for (Map.Entry<byte[], byte[]> entry : holder.entrySet()) { 
     byte typeKey = 0; 

     // getting the key length as byte (that's what we need to do) 
     byte lengthOfKey = (byte) entry.getKey().length; 
     byte[] actualKey = entry.getKey(); 
    } 

byte只能存儲最大值爲127,我們看到了一些我們的紀錄,而我們讀取文件lengthOfKey就要爲負的,如下圖所示:

程序,該程序讀取文件:

byte keyType = dis.readByte(); 

// for some record this is coming as negative. For example -74 
byte lengthOfKey = dis.readByte(); 

現在我的問題是:有什麼辦法,我可以找出是因爲它得到了轉化爲重點的實際長度編寫它時寫上-74。我的意思是它應該大於127,這就是爲什麼它被轉換爲-74,但實際價值是多少?

我想的問題是如何負字節值轉換爲短或整數?我只是想驗證一下,看看密鑰的實際長度是多少,因爲密鑰已經轉換爲負值。

回答

3

如果原始長度從entry.getKey().length大於255,則實際長度信息丟失。但是,如果原始長度在128255之間,則可以檢索它。

鑄造到byte的縮小轉換隻保留最低有效8位,但第8位現在被解釋爲-128而不是128

您可以使用0xFF執行位操作,該操作將保留所有位,但會隱式地將該值擴大回int

int length = lengthOfKey & 0xFF; 

lengthOfKey (byte = -74): 10110110 

它加寬到int,用符號擴展:

lengthOfKey (int = -74): 11111111 11111111 11111111 10110110 

屏蔽掉後8位爲int

length (int = 182): 00000000 00000000 00000000 10110110 

這將產生負面byte轉換回數字在128255之間。

+0

感謝您的解釋。我能夠解碼數據,我可以看到它的實際長度。你能解釋我爲什麼這麼說嗎? '如果來自entry.getKey()。length的原始長度大於255,則實際長度信息將丟失。「以及爲什麼它會丟失?只是爲了我的理解目的。 – john

+0

如果您收到了長度爲0的字符,那麼它在256字節的'byte「形式中是無法區分的。二進制中的「0」是00000000,二進制中的「256」是1 00000000,但當發生縮小轉換爲「字節」時丟失「1」,並且它顯示爲「0」。 – rgettman

0

將假定的無符號字節轉換爲int。

int value = (byteValue >= (byte) 0) ? (int) byteValue : 256 + (int) byteValue;