Java中将十六进制字符串转换为字节的方法

12
在Java中,如何将一个十六进制字符串表示的字节(例如"1e")转换为字节值?
例如:
byte b = ConvertHexStringToByte("1e");

那么,你有什么问题吗?如果有的话。 - user207421
1
这是一个好问题。为什么它被关闭了? - Joe
同意@Joe的观点。但也可以参考https://dev59.com/NGkw5IYBdhLWcg3wx9eC - flow2k
3个回答

23

您可以使用Byte.parseByte("a", 16);,但这仅适用于最大值为127的值, 比127大的值将需要转换为byte类型,由于有符号/无符号问题, 因此我建议先将其转换为int,然后再将其强制转换为byte。

(byte) (Integer.parseInt("ef",16) & 0xff);

1
& 0xff 用于获取 int 类型的无符号值。 - JCasso
1
这应该是被接受的答案!它完全满足了我的需求! - VikingPingvin

14
Integer.parseInt(str, 16);

我尝试过那个,但它创建的是一个int而不是byte——所以对于“1e”,即使我强制转换为byte,我也会得到30而不是0x1e。 - phpscriptcoder
1
当类型为byte时,如何区分值为30和0x1e的字节,它们在存储时是相同的? - Kathy Van Stone
2
@phpscriptcoder:不,你会得到1e。试一下这个:String roundtrip = Integer.toHexString(Integer.parseInt(str, 16)); - erickson

12

Byte.parseByte方法可以通过解析字符串来返回一个byte

使用带有(String, int)签名的方法,可以指定基数为16,因此可以解析字节的十六进制表示:

Byte.parseByte("1e", 16);

8
危险!该方法无法解析负字节值,例如"AD"。请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6259307。最好使用Integer.parseInt。 - Dave L.
1
@Dave L. 这不正确,因为根据评估器的说法:所讨论的方法正按照规定的方式运作。使用此方法,负值必须通过使用减号“-”来表示,而不是通过将符号位设置为1来表示。换句话说,对于16进制,有效字符串范围从“-80”(-128)到“7f”(127);16进制的“AD”是正数173,超出了范围。 - Caner
1
@LAS_VEGAS 确实,Byte.parseByte的表现如规定的那样。然而,如果有人想要将一个8位值的2个字符的十六进制表示转换为相应的字节,正如提问者所暗示的那样,那么这个方法(按照规定和实现!)将无法处理高位为1的值。 - Dave L.
1
你对解析负字节有什么评论吗,戴夫? - Shark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接