我有以下代码......
int Val=-32768;
String Hex=Integer.toHexString(Val);
Run Code Online (Sandbox Code Playgroud)
这相当于 ffff8000
int FirstAttempt=Integer.parseInt(Hex,16); // Error "Invalid Int"
int SecondAttempt=Integer.decode("0x"+Hex); // Error "Invalid Int"
Run Code Online (Sandbox Code Playgroud)
因此,最初,它将值-32768转换为十六进制字符串ffff8000,但是它不能将十六进制字符串转换回整数.
在.Net
它的工作,我期待,和returns -32768
.
我知道我可以编写自己的小方法来自行转换,但我只是想知道我是否遗漏了某些东西,或者这是否真的是一个错误?
bri*_*ium 63
int val = -32768;
String hex = Integer.toHexString(val);
int parsedResult = (int) Long.parseLong(hex, 16);
System.out.println(parsedResult);
Run Code Online (Sandbox Code Playgroud)
这就是你如何做到的.
它之所以不起作用:Integer.parseInt
采用带符号的int,同时toHexString
产生无符号结果.因此,如果插入高于的值0x7FFFFFF
,则会自动抛出错误.如果您将其解析为long
相反,它仍将被签名.但是当你把它强制转换为int时,它会溢出到正确的值.
小智 44
它溢出,因为数字是负数.
试试这个,它会工作:
int n = (int) Long.parseLong("ffff8000", 16);
Run Code Online (Sandbox Code Playgroud)
小智 21
int
到十六进制:
Integer.toHexString(intValue);
Run Code Online (Sandbox Code Playgroud)十六进制int
:
Integer.valueOf(hexString, 16).intValue();
Run Code Online (Sandbox Code Playgroud)您可能还想使用long
而不是int
(如果值不适合int
边界):
十六进制long
:
Long.valueOf(hexString, 16).longValue()
Run Code Online (Sandbox Code Playgroud)long
到Hex
Long.toHexString(longValue)
Run Code Online (Sandbox Code Playgroud)小智 8
值得一提的是,Java的8所拥有的方法Integer.parseUnsignedInt
,并Long.parseUnsignedLong
已经做了你想要的东西,具体是:
Integer.parseUnsignedInt("ffff8000",16) == -32768
该名称有点令人困惑,因为它从十六进制字符串中解析一个有符号整数,但它确实起作用.
尝试使用BigInteger类,它的工作原理.
int Val=-32768;
String Hex=Integer.toHexString(Val);
//int FirstAttempt=Integer.parseInt(Hex,16); // Error "Invalid Int"
//int SecondAttempt=Integer.decode("0x"+Hex); // Error "Invalid Int"
BigInteger i = new BigInteger(Hex,16);
System.out.println(i.intValue());
Run Code Online (Sandbox Code Playgroud)
由于 Integer.toHexString(byte/integer) 不起作用,当您尝试转换有符号字节(例如 UTF-16 解码字符)时,您必须使用:
Integer.toString(byte/integer, 16);
Run Code Online (Sandbox Code Playgroud)
或者
String.format("%02X", byte/integer);
Run Code Online (Sandbox Code Playgroud)
反向你可以使用
Integer.parseInt(hexString, 16);
Run Code Online (Sandbox Code Playgroud)