如何将Int转换为无符号字节和后退

dar*_*sky 87 java int byte

我需要将一个数字转换为无符号字节.该数字始终小于或等于255,因此它将适合一个字节.

我还需要将该字节转换回该数字.我怎么用Java做到这一点?我尝试了几种方法而且都没有用.这就是我现在要做的事情:

int size = 5;
// Convert size int to binary
String sizeStr = Integer.toString(size);
byte binaryByte = Byte.valueOf(sizeStr);
Run Code Online (Sandbox Code Playgroud)

现在将该字节转换回数字:

Byte test = new Byte(binaryByte);
int msgSize = test.intValue();
Run Code Online (Sandbox Code Playgroud)

显然,这不起作用.出于某种原因,它总是将数字转换为65.有什么建议?

JB *_*zet 188

始终用Java签名一个字节.您可以通过二进制获取其无符号值,并使用0xFF,但是:

int i = 234;
byte b = (byte) i;
System.out.println(b); // -22
int i2 = b & 0xFF;
System.out.println(i2); // 234
Run Code Online (Sandbox Code Playgroud)

  • 为什么按位和"0xFF"会产生无符号整数?一些解释会非常有用. (13认同)
  • Java 字节有符号吗?天哪,多么恐怖啊。 (2认同)
  • Java 8使用相同的方法:public static int toUnsignedInt(byte x){return((int)x)&0xff; } (2认同)

Jef*_*oom 51

Java 8提供Byte.toUnsignedInt转换byteint无符号转换.在Oracle的JDK中,这只是实现,return ((int) x) & 0xff;因为HotSpot已经了解如何优化这种模式,但它可以在其他VM上进行内部化.更重要的是,不需要任何先验知识来理解呼叫的toUnsignedInt(foo)作用.

总体而言,Java的8提供了方法,将byteshort无符号intlong,和int为无符号long.转换的方法byte为无符号short故意省略,因为JVM只提供算术intlong反正.

要将int转换回字节,只需使用强制转换:(byte)someInt.由此产生的缩小原语转换将丢弃除最后8位之外的所有内容.


dm7*_*m78 7

如果您只需要将有符号的int中的预期8位值转换为无符号值,则可以使用简单的位移:

int signed = -119;  // 11111111 11111111 11111111 10001001

/**
 * Use unsigned right shift operator to drop unset bits in positions 8-31
 */
int psuedoUnsigned = (signed << 24) >>> 24;  // 00000000 00000000 00000000 10001001 -> 137 base 10

/** 
 * Convert back to signed by using the sign-extension properties of the right shift operator
 */
int backToSigned = (psuedoUnsigned << 24) >> 24; // back to original bit pattern
Run Code Online (Sandbox Code Playgroud)

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

如果使用的不是int基本类型,你显然需要调整移位量:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

另外,请记住,您不能使用byte类型,这样做会导致其他回答者提到的签名值.您可以用来表示8位无符号值的最小基本类型是a short.


Ram*_*h-X 5

除了char,Java 中的所有其他数字数据类型都是有符号的。

正如在之前的答案中所说,您可以通过and使用0xFF. 在这个答案中,我将解释它是如何发生的。

int i = 234;
byte b = (byte) i;
System.out.println(b);  // -22

int i2 = b & 0xFF;      
// This is like casting b to int and perform and operation with 0xFF

System.out.println(i2); // 234
Run Code Online (Sandbox Code Playgroud)

如果您的机器是 32 位,那么int数据类型需要 32 位来存储值。byte只需要 8 位。

int变量i在内存中表示如下(作为 32 位整数)。

0{24}11101010
Run Code Online (Sandbox Code Playgroud)

那么byte变量b表示为:

11101010
Run Code Online (Sandbox Code Playgroud)

由于bytes 是有符号的,这个值代表-22。(搜索 2 的补码以了解有关如何在内存中表示负整数的更多信息)

然后,如果您强制转换为,int它仍然是-22因为强制转换保留了数字的符号。

1{24}11101010
Run Code Online (Sandbox Code Playgroud)

执行操作的强制转换32-bit值。band0xFF

 1{24}11101010 & 0{24}11111111
=0{24}11101010
Run Code Online (Sandbox Code Playgroud)

然后你就得到234了答案。