将无符号字节转换为有符号字节

Joe*_*dev 9 java unsigned signed byte

有没有一种简单而优雅的方法可以将无符号字节值转换为java中的有符号字节值?例如,如果我只有int值240(二进制(24位+ 11110000)= 32位),我怎样才能得到这个int的有符号值?

小智 25

在Java中,所有原始类型(除了char)都是有符号的.你不能有一个无符号字节.您可以做的唯一事情是将无符号字节转换为int,以便您可以读取其正确的值:

int a = b & 0xff
Run Code Online (Sandbox Code Playgroud)

如果你想在一个字节类型中存储一个无符号字节值,你显然可以,但每次你需要"处理"它时,只需记住如上所示再次投射它.


Tas*_*kos 10

Java没有无符号值,除了char.请考虑以下代码段:

byte val = (byte)255;
System.out.println(String.valueOf(val));
Run Code Online (Sandbox Code Playgroud)

结果将为-1,因为最低的8位被复制到字节变量.

  • "Java没有无符号值.":不是这样.`char`是未签名的. (3认同)
  • 是."最低"是指具有最低位置值(2 ^ n)的位.因此,复制位置值为2 ^ 0-2 ^ 7的位,但丢弃具有值2 ^ 8或更高的位.因为它是java,所以你不必担心字节序. (2认同)

don*_*ner 7

以下是存储和转换无符号字节值的方法:

byte b = (byte) 144; // binary value = 10010000
Run Code Online (Sandbox Code Playgroud)

如果你投射bint这里会发生什么:

int i = b;
System.out.println("value: "+i);  
System.out.println("binary: " + Integer.toBinaryString(i));
Run Code Online (Sandbox Code Playgroud)

输出:

value: -112 <- Incorrect value
binary: 11111111111111111111111110010000 
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?字节在 Java 中是有符号的,并且b是负数,因此强制转换操作从左边开始用 1 填充结果 int。更多关于 java 数据格式的信息

那么我们如何从 -112 返回到正确的 144 值呢?我们需要一个 32 位位掩码,我们可以使用以下命令创建它int

int mask = 0x000000FF; // This is often shortened to just 0xFF
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用按位运算&符将最左边的 24 位“归零”,只留下我们原来的 8 位。

int unsignedValue = b & mask; // value = 144
Run Code Online (Sandbox Code Playgroud)

我们的原始值 144 已经恢复,可以安全地转换回一个字节:

byte original = (byte) unsignedValue;
Run Code Online (Sandbox Code Playgroud)


omn*_*nom 6

public int getUnsignedByte(byte[] bytes, int offset) {
    return (bytes[offset] & 0xFF);
}
Run Code Online (Sandbox Code Playgroud)

应该做的工作.