簡體   English   中英

在Java中與字節之間來回轉換

[英]Converting to and from bytes in java

我在理解與字節或一般字節之間的轉換時遇到麻煩

byte b = (byte)170;
System.out.println("Byte to int" + (int)b);

為什么當我將170強制轉換為一個字節然后將該字節強制轉換為int時,我得到-86,這是什么正確的方法呢?

編輯:好的,所以我的問題的答案非常簡單( byte范圍從-128到127)...讓我感到困惑的是,我真的希望二進制10101010位於字節中,所以我想出了用int表示該數字並將其放在字節中。 有人可以告訴我如何將二進制數轉換為字節嗎?

170的32位整數表示形式為

0000 0000 0000 0000 0000 0000 1010 1010 

將其轉換為byte ,它將變為1010 1010 由於Java中的所有整數都是帶符號的,因此它將1010 1010視為2的補碼 8位整數。 那是-86。

當您使用(int) b將該字節轉換回整數時,它的符號擴展為:

1111 1111 1111 1111 1111 1111 1010 1010 

也是-86。 您想要對其應用位掩碼,因此它再次變為170。

(int) (0xff & b)將給您170:

1111 1111 1111 1111 1111 1111 1010 1010 
0000 0000 0000 0000 0000 0000 1111 1111 & (bitwise and)
---------------------------------------
0000 0000 0000 0000 0000 0000 1010 1010 

問題是字節是8位數據類型,其范圍是-128到127。因此沒有“無損轉換” ...

byte原始類型的最小值為-128,最大值為127(含)。

您正在嘗試通過顯式強制轉換分配超出byte范圍的170( int ),這會導致丟失有關數值總體大小的信息。

參見此處: 基本數據類型

還要檢查此JLS部分: 5.1.3縮小基元轉換

這是因為字節是在Java中簽名的,所以您基本上在溢出b。

要將整數轉換為字節:

int original = 170;
byte b = (byte)(0xFF & original);

通過“截斷”第一個字節之外的任何內容,這會將10101010放入byteNum。 如果您打印該號碼,您將得到-86。 要轉換回來,請執行以下操作:

int num = (int)b & 0xFF;

這會將字節轉換為整數,然后屏蔽簽名位,恢復值為170。

您不能將170存儲到一個字節中。 字節大小為-128至127。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM