From 982cf7980e69aa7c68565b1abf15b5a49b20299b Mon Sep 17 00:00:00 2001 From: Catnies Date: Fri, 27 Jun 2025 01:43:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=200xff=20=E7=AD=89=E5=8D=81?= =?UTF-8?q?=E5=85=AD=E8=BF=9B=E5=88=B6=E5=86=99=E6=B3=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/core/util/SNBTReader.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SNBTReader.java b/core/src/main/java/net/momirealms/craftengine/core/util/SNBTReader.java index ec6fbc279..0f8f1b851 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/SNBTReader.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SNBTReader.java @@ -226,7 +226,20 @@ public final class SNBTReader extends DefaultStringReader { } int tokenLength = getCursor() - tokenStart - lastWhitespace; // 计算值长度需要再减去尾部空格. if (tokenLength == 0) return null; // 如果值长度为0则返回null. - if (contentHasWhitespace) return substring(tokenStart, tokenStart + tokenLength); // 如果值的中间有空格, 一定是字符串, 可直接返回. + String fullString = substring(tokenStart, tokenStart + tokenLength); + if (contentHasWhitespace) return fullString; // 如果值的中间有空格, 一定是字符串, 可直接返回. + + // 十六进制处理 + String fullHex = fullString.toLowerCase(); + boolean negativeHex = fullHex.startsWith("-0x"); + boolean positiveHex = fullHex.startsWith("0x"); + if (negativeHex || positiveHex) { + String hexDigits = fullHex.substring(negativeHex ? 3 : 2); // 去掉 0x / -0x + if (hexDigits.isEmpty()) return fullString; // 没值了代表这是个字符串. + long value = Long.parseLong(hexDigits, 16); + if (negativeHex) value = -value; + return (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) ? (int) value : value; // 默认返回的还是Int类型的喵. + } // 布尔值检查 if (tokenLength == 4) { @@ -257,7 +270,6 @@ public final class SNBTReader extends DefaultStringReader { return Double.parseDouble(substring(tokenStart, tokenStart + tokenLength)); } default -> { - String fullString = substring(tokenStart, tokenStart + tokenLength); try { double d = Double.parseDouble(fullString); if (d % 1 != 0 || fullString.contains(".") || fullString.contains("e")) {