This question already has answers here:
Can we make unsigned byte in Java
                                
                                    (15个答案)
                                
                        
                                5年前关闭。
            
                    
我有一个字节数组:

byte[] a = new byte[3];


我已经添加了一些字节。对于此示例,假设3、4和210。

我想打印此字节字符串看起来像3 4 210,但是我却得到3 4 -46

我正在使用String.valueOf(a[i])进行转换。有什么方法可以强制此转换提供无符号值?

提前致谢,

编辑:感谢对此问题的各种反馈。我没有意识到Java字节默认是带符号的值,因此我怀疑String.valueOf()方法是问题所在。原来只是使用

String.valueOf(a[i]&0xFF)


解决签名格式问题。

再次感谢您的反馈!

最佳答案

Guava提供了可以进行转换的UnsignedBytes类。 static toString(byte)方法


  返回x的字符串表示形式,其中x被视为无符号。


例如

System.out.println(UnsignedBytes.toString(a[i]));


a[i] = -46将在哪里打印

210


在内部,这只是调用

public static int toInt(byte value) {
    return value & UNSIGNED_MASK; // UNSIGNED_MASK = 0xFF
}


并将int转换为它返回的String



解释一下



someByte & 0xFF


由于OxFF是整数文字,因此someByte值将扩展为int。让我们以值-46为例。其二进制表示为

11111111111111111111111111010010


0xFF的二进制表示为

11111111 // ie 255


如果您和&这两个

11111111111111111111111111010010
00000000000000000000000011111111
--------------------------------
00000000000000000000000011010010


等于

210


基本上,您只保留int的低8位。

09-10 09:01
查看更多