直升机:
我有一个问题,我在 c 中解决了,但现在我想在 hava 中解决:我有一个类似的字符串:'\x03\x00\x00\x00' 这表示整数的十六进制值。我转换为0x03\0x00 ...现在我想获得整数,但我不知道如何在java中做到这一点
有人可以给我一些想法吗?
提前致谢
(是否有某种方式可以直接使用这种格式('\x03\x00\x00\x00')而不使用 byte[] 数组?在 C 中我可以直接使用这种格式来构建一个整数(int)吗?)
这是我的单行解决方案
Integer.parseInt("\\x03\\x00\\x00\\x00".replaceAll("\\\\x", ""), 16)
当然,您可以将其包装在一个函数中。
我会这样做是这样的:
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<<
移位运算符和按位运算符&
和|
运算符。