在java中从十六进制转换为int,反之亦然

在java中从十六进制转换为int,反之亦然,java,hex,Java,Hex,我有下一个从十六进制转换为int的方法: public static byte[] convertsHexStringToByteArray2(String hexString) { int hexLength = hexString.length() / 2; byte[] bytes = new byte[hexLength]; for (int i = 0; i < hexLength; i++) { int hex = Integer.par

我有下一个从十六进制转换为int的方法:

public static byte[] convertsHexStringToByteArray2(String hexString) {
    int hexLength = hexString.length() / 2;
    byte[] bytes = new byte[hexLength];
    for (int i = 0; i < hexLength; i++) {
        int hex = Integer.parseInt(hexString.substring(2 * i, 2 * i + 2), 16);
        bytes[i] = (byte) hex;
    }

    return bytes;
}
输出:

[-128]
ffffff80
80
我预计“80”将是128。我的方法有什么问题

我有下一个方法将从十六进制转换为int

您发布的方法将十六进制字符串转换为字节数组,而不是
int
。这就是为什么它弄乱了它的标志

将十六进制转换为整数很容易:

Integer.parseInt("80", 16)
$1 ==> 128
但是,如果您想通过强制转换获得字节数组以进行进一步处理:

(byte) Integer.parseInt("80", 16)
$2 ==> -128
它“改变”了它的标志。有关原语和有符号变量类型的更多信息,请参阅,其中说明:

字节数据类型是一个8位有符号的2的补码整数。其最小值为-128,最大值为127(含)。字节数据类型对于在大型阵列中节省内存非常有用,而实际上节省内存很重要。它们也可以用来代替int,因为它们的限制有助于澄清代码;变量的范围是有限的这一事实可以作为文档的一种形式

只需增加要转换的值即可轻松反转符号:

(byte) Integer.parseInt("80", 16) & 0xFF
$3 ==> 128

这将得到一个包含期望值的字节。从技术上讲,这个结果是不正确的,如果你想再次得到一个int或十六进制字符串,你必须再次切换符号。如果您只想在十六进制和十进制之间转换,我建议您不要使用字节数组。

Java中的一个字节存储从-128到127的数字。十六进制中的80是128,整数太大,无法存储在字节中。所以,这个值是环绕的。请使用其他类型存储您的值(例如短值)。

谢谢。我搞砸了。这是字节类型
(byte) Integer.parseInt("80", 16) & 0xFF
$3 ==> 128