我需要将一个数字转换为无符号字节.该数字始终小于或等于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)
Jef*_*oom 51
Java 8提供Byte.toUnsignedInt
转换byte
为int
无符号转换.在Oracle的JDK中,这只是实现,return ((int) x) & 0xff;
因为HotSpot已经了解如何优化这种模式,但它可以在其他VM上进行内部化.更重要的是,不需要任何先验知识来理解呼叫的toUnsignedInt(foo)
作用.
总体而言,Java的8提供了方法,将byte
和short
无符号int
和long
,和int
为无符号long
.转换的方法byte
为无符号short
被故意省略,因为JVM只提供算术int
和long
反正.
要将int转换回字节,只需使用强制转换:(byte)someInt
.由此产生的缩小原语转换将丢弃除最后8位之外的所有内容.
如果您只需要将有符号的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
.
除了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)
由于byte
s 是有符号的,这个值代表-22
。(搜索 2 的补码以了解有关如何在内存中表示负整数的更多信息)
然后,如果您强制转换为,int
它仍然是-22
因为强制转换保留了数字的符号。
1{24}11101010
Run Code Online (Sandbox Code Playgroud)
执行操作的强制转换32-bit
值。b
and
0xFF
1{24}11101010 & 0{24}11111111
=0{24}11101010
Run Code Online (Sandbox Code Playgroud)
然后你就得到234
了答案。