From e6054b34fefb554bf87c31e9d3b4b92e982c4eb8 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 25 Dec 2025 23:12:30 +0800 Subject: [PATCH] =?UTF-8?q?`HexUtil.toHex`=E6=B7=BB=E5=8A=A0=E5=AF=B9float?= =?UTF-8?q?=E5=92=8Cdouble=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=8F=8D=E5=90=91=E6=96=B9=E6=B3=95=EF=BC=88?= =?UTF-8?q?pr#4193@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/v7/core/codec/binary/HexUtil.java | 40 +++++++++++++++ .../cn/hutool/v7/core/util/HexUtilTest.java | 49 +++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/codec/binary/HexUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/codec/binary/HexUtil.java index 59c0212da1..17ca6fc949 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/codec/binary/HexUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/codec/binary/HexUtil.java @@ -199,6 +199,46 @@ public class HexUtil extends Hex { return Long.parseLong(removeHexPrefix(value), 16); } + /** + * 转为16进制字符串 + * + * @param value float值 + * @return 16进制字符串 + */ + public static String toHex(float value) { + return Integer.toHexString(Float.floatToIntBits(value)); + } + + /** + * 16进制字符串转为float + * + * @param value 16进制字符串 + * @return 16进制字符串float值 + */ + public static float hexToFloat(String value) { + return Float.intBitsToFloat(Integer.parseUnsignedInt(removeHexPrefix(value), 16)); + } + + /** + * 转为16进制字符串 + * + * @param value double值 + * @return 16进制字符串 + */ + public static String toHex(double value) { + return Long.toHexString(Double.doubleToLongBits(value)); + } + + /** + * 16进制字符串转为double + * + * @param value 16进制字符串 + * @return 16进制字符串double值 + */ + public static double hexToDouble(String value) { + return Double.longBitsToDouble(Long.parseUnsignedLong(removeHexPrefix(value), 16)); + } + /** * 将byte值转为16进制并添加到{@link StringBuilder}中 * diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/util/HexUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/util/HexUtilTest.java index 3c14f9b553..82a73eb4ca 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/util/HexUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/util/HexUtilTest.java @@ -165,4 +165,53 @@ public class HexUtilTest { final String result = HexUtil.format("123", "0x"); assertEquals("0x12 0x3", result); } + + @Test + public void hexToFloatTest() { + //测试正常浮点数值 + float value1 = 1.5f; + String hex1 = HexUtil.toHex(value1); + assertEquals(value1, HexUtil.hexToFloat(hex1)); + + //测试负数 + float value2 = -1.5f; + String hex2 = HexUtil.toHex(value2); + assertEquals(value2, HexUtil.hexToFloat(hex2)); + + //测试科学计数法值 + float value3 = 1.23456789e-5f; + String hex3 = HexUtil.toHex(value3); + assertEquals(value3, HexUtil.hexToFloat(hex3)); + + //测试十六进制前缀 + assertEquals(1.5f, HexUtil.hexToFloat("0x3fc00000")); + assertEquals(1.5f, HexUtil.hexToFloat("#3fc00000")); + } + + @Test + public void hexToDoubleTest() { + //测试正常双精度浮点数值 + double value1 = 1.5; + String hex1 = HexUtil.toHex(value1); + assertEquals(value1, HexUtil.hexToDouble(hex1)); + + //测试负数 + double value3 = -1.5; + String hex3 = HexUtil.toHex(value3); + assertEquals(value3, HexUtil.hexToDouble(hex3)); + + //测试高精度数值 + double value4 = Math.PI; + String hex4 = HexUtil.toHex(value4); + assertEquals(value4, HexUtil.hexToDouble(hex4)); + + //测试科学计数法值 + double value5 = 1.23456789012345e-10; + String hex5 = HexUtil.toHex(value5); + assertEquals(value5, HexUtil.hexToDouble(hex5)); + + //测试十六进制前缀 + assertEquals(1.5, HexUtil.hexToDouble("0x3ff8000000000000")); + assertEquals(1.5, HexUtil.hexToDouble("#3ff8000000000000")); + } }