![](/img/trans.png)
[英]Convert a hex string into base 36 encoded string and vice versa in 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.