西洛:
我有一个问题,我在c中解决了,但现在我想在hava中做到这一点: 我有一个字符串,如:'\ x03 \ x00 \ x00 \ x00' 这表示整数的十六进制值。我转换为0x03 \ 0x00 ... 现在我想获取整数,但我不知道如何在java中实现它
有人可以给我一些想法吗?
提前致谢
(是否可以直接使用这种格式('\ x03 \ x00 \ x00 \ x00')而不使用byte []数组?在C中我可以直接使用这种格式来构建整数(int)吗?)
答案 0 :(得分:1)
这是我的一行解决方案
Integer.parseInt("\\x03\\x00\\x00\\x00".replaceAll("\\\\x", ""), 16)
当然,你可以将它包装在一个函数中。
答案 1 :(得分:0)
我这样做是这样的:
Scanner sc = new Scanner(inputString);
int value = 0;
for (int i = 0; i < 4; i++) {
sc.next("\\\\x");
byte b = sc.nextByte(16);
value = (value << 8) | (b & 0xff);
}
if (sc.hasNext()) {
throw new SomeException("Unexpected stuff at the end");
}
(更新 - 更正了签名扩展错误...并在输入字符串末尾检测到意外的内容。)
现在,如果遇到无法应对的输入,它将引发异常。在这种情况下,它被设计为匹配一个完全4字节的序列。
但是(IMO)比接受错误输入和产生错误结果更可取。这是使用模式匹配技巧的聪明解决方案的风险,以避免进行适当的解析。
非常感谢答案,我完全不理解这个解决方案,它给了我sc.next中的错误(“\\ x”);
错误将是因为您在其中包含少于4个字节的字符串上使用此错误,或者具有与您的示例的格式不匹配的字符串。如果您希望代码处理小于(或多于)4个字节的序列,则需要更改它。
我想知道你为什么这样做:
value=(value <<8) | b
(但我正在努力理解它)非常感谢
那里有一个错误。我纠正了
value = (value << 8) | (b & 0xff);
将b
字节添加到value
中数字的最低端,这样做有点麻烦。阅读Java <<
移位运算符和逐位&
和|
运算符。