Java将int转换为十六进制并再次返回

Ric*_*h S 68 java string hex

我有以下代码......

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

您可能还想使用long而不是int(如果值不适合int边界):


小智 8

值得一提的是,Java的8所拥有的方法Integer.parseUnsignedInt,并Long.parseUnsignedLong已经做了你想要的东西,具体是:

Integer.parseUnsignedInt("ffff8000",16) == -32768

该名称有点令人困惑,因为它从十六进制字符串中解析一个有符号整数,但它确实起作用.


man*_*esh 7

尝试使用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)


Spe*_*ius 6

由于 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)