小智 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位被复制到字节变量.
以下是存储和转换无符号字节值的方法:
byte b = (byte) 144; // binary value = 10010000
Run Code Online (Sandbox Code Playgroud)
如果你投射b到int这里会发生什么:
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)
public int getUnsignedByte(byte[] bytes, int offset) {
return (bytes[offset] & 0xFF);
}
Run Code Online (Sandbox Code Playgroud)
应该做的工作.
| 归档时间: |
|
| 查看次数: |
32105 次 |
| 最近记录: |