繁体   English   中英

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

[英]Convert from hex to int and vice versa in java

我有下一个从十六进制转换为 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;
}

当我将它用于“80”十六进制字符串时,我会感到奇怪,不是预期的结果:

public static void main(String[] args) {
    System.out.println(Arrays.toString(convertsHexStringToByteArray2("80"))); // gives -128
    System.out.println(Integer.toHexString(-128));
    System.out.println(Integer.toHexString(128));
}

output:

[-128]
ffffff80
80

我预计“80”将是 128。我的方法有什么问题?

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

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

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

Integer.parseInt("80", 16)
$1 ==> 128

但是,如果您想通过强制转换获得一个字节数组以进行进一步处理:

(byte) Integer.parseInt("80", 16)
$2 ==> -128

它“改变”了它的符号。 有关原语和有符号变量类型的更多信息,请查看Primitive Data Types ,其中说:

字节数据类型8 位有符号二进制补码 integer。 它的最小值为-128 ,最大值为127(含) 字节数据类型可用于将 memory 保存在大型 arrays 中,其中 memory 节省实际上很重要。 它们也可以用来代替 int ,它们的限制有助于澄清您的代码; 变量的范围有限这一事实可以作为一种文档形式。

只需增加要转换的值,就可以轻松地反转符号:

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

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

Java 中的一个字节存储从 -128 到 127 的数字。十六进制的 80 是 128 作为 integer,它太大而无法存储在一个字节中。 因此,价值环绕。 使用不同的类型来存储您的值(例如 short)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM