在java中从十六进制转换为int,反之亦然
我有下一个从十六进制转换为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
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