字符串为\ x03 \ x00 \ x00 \ x00为整数

时间:2012-06-01 07:58:24

标签: java string hex

西洛:

我有一个问题,我在c中解决了,但现在我想在hava中做到这一点: 我有一个字符串,如:'\ x03 \ x00 \ x00 \ x00' 这表示整数的十六进制值。我转换为0x03 \ 0x00 ... 现在我想获取整数,但我不知道如何在java中实现它

有人可以给我一些想法吗?

提前致谢

(是否可以直接使用这种格式('\ x03 \ x00 \ x00 \ x00')而不使用byte []数组?在C中我可以直接使用这种格式来构建整数(int)吗?)

2 个答案:

答案 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 <<移位运算符和逐位&|运算符。