diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Hex.java b/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Hex.java
new file mode 100644
index 000000000..0073e7749
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Hex.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2024. looly(loolly@aliyun.com)
+ * Hutool is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * https://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ */
+
+package org.dromara.hutool.core.codec.binary;
+
+import org.dromara.hutool.core.exception.HutoolException;
+import org.dromara.hutool.core.text.StrUtil;
+import org.dromara.hutool.core.util.ByteUtil;
+import org.dromara.hutool.core.util.CharsetUtil;
+
+import java.nio.charset.Charset;
+
+/**
+ * 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制,一般用数字0到9和字母A到F表示(其中:A~F即10~15)。
+ * 例如十进制数57,在二进制写作111001,在16进制写作39。
+ * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的32,而不是十进制的20
+ *
+ * 参考:https://my.oschina.net/xinxingegeya/blog/287476
+ *
+ * @author Looly
+ * @see Base16Codec
+ */
+public class Hex {
+ // region ----- encode
+
+ /**
+ * 将字节数组转换为十六进制字符数组
+ *
+ * @param data byte[]
+ * @return 十六进制char[]
+ */
+ public static char[] encode(final byte[] data) {
+ return encode(data, true);
+ }
+
+ /**
+ * 将字节数组转换为十六进制字符数组
+ *
+ * @param str 字符串
+ * @param charset 编码
+ * @return 十六进制char[]
+ */
+ public static char[] encode(final String str, final Charset charset) {
+ return encode(ByteUtil.toBytes(str, charset), true);
+ }
+
+ /**
+ * 将字节数组转换为十六进制字符数组
+ *
+ * @param data byte[]
+ * @param toLowerCase {@code true} 传换成小写格式 , {@code false} 传换成大写格式
+ * @return 十六进制char[]。如果提供的data为{@code null},返回{@code null}
+ */
+ public static char[] encode(final byte[] data, final boolean toLowerCase) {
+ if (null == data) {
+ return null;
+ }
+ return (toLowerCase ? Base16Codec.CODEC_LOWER : Base16Codec.CODEC_UPPER).encode(data);
+ }
+
+ /**
+ * 将字节数组转换为十六进制字符串
+ *
+ * @param data byte[]
+ * @return 十六进制String
+ */
+ public static String encodeStr(final byte[] data) {
+ return encodeStr(data, true);
+ }
+
+ /**
+ * 将字符串转换为十六进制字符串,结果为小写,默认编码是UTF-8
+ *
+ * @param data 被编码的字符串
+ * @return 十六进制String
+ */
+ public static String encodeStr(final String data) {
+ return encodeStr(data, CharsetUtil.UTF_8);
+ }
+
+ /**
+ * 将字符串转换为十六进制字符串,结果为小写
+ *
+ * @param data 需要被编码的字符串
+ * @param charset 编码
+ * @return 十六进制String
+ */
+ public static String encodeStr(final String data, final Charset charset) {
+ return encodeStr(ByteUtil.toBytes(data, charset), true);
+ }
+
+ /**
+ * 将字节数组转换为十六进制字符串
+ *
+ * @param data byte[]
+ * @param toLowerCase {@code true} 传换成小写格式 , {@code false} 传换成大写格式
+ * @return 十六进制String
+ */
+ public static String encodeStr(final byte[] data, final boolean toLowerCase) {
+ return StrUtil.str(encode(data, toLowerCase), CharsetUtil.UTF_8);
+ }
+ // endregion
+
+ // region ----- decode
+
+ /**
+ * 将十六进制字符数组转换为字符串,默认编码UTF-8
+ *
+ * @param hexStr 十六进制String
+ * @return 字符串
+ */
+ public static String decodeStr(final String hexStr) {
+ return decodeStr(hexStr, CharsetUtil.UTF_8);
+ }
+
+ /**
+ * 将十六进制字符数组转换为字符串
+ *
+ * @param hexStr 十六进制String
+ * @param charset 编码
+ * @return 字符串
+ */
+ public static String decodeStr(final String hexStr, final Charset charset) {
+ if (StrUtil.isEmpty(hexStr)) {
+ return hexStr;
+ }
+ return StrUtil.str(decode(hexStr), charset);
+ }
+
+ /**
+ * 将十六进制字符数组转换为字符串
+ *
+ * @param hexData 十六进制char[]
+ * @param charset 编码
+ * @return 字符串
+ */
+ public static String decodeStr(final char[] hexData, final Charset charset) {
+ return StrUtil.str(decode(hexData), charset);
+ }
+
+ /**
+ * 将十六进制字符串解码为byte[]
+ *
+ * @param hexStr 十六进制String
+ * @return byte[]
+ */
+ public static byte[] decode(final String hexStr) {
+ return decode((CharSequence) hexStr);
+ }
+
+ /**
+ * 将十六进制字符数组转换为字节数组
+ *
+ * @param hexData 十六进制char[]
+ * @return byte[]
+ * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
+ */
+ public static byte[] decode(final char[] hexData) {
+ return decode(String.valueOf(hexData));
+ }
+
+ /**
+ * 将十六进制字符数组转换为字节数组
+ *
+ * @param hexData 十六进制字符串
+ * @return byte[]
+ * @throws HutoolException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
+ * @since 5.6.6
+ */
+ public static byte[] decode(final CharSequence hexData) {
+ return Base16Codec.CODEC_LOWER.decode(hexData);
+ }
+
+ // endregion
+}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/HexUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/HexUtil.java
index ee68b6f71..0d23863a4 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/HexUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/HexUtil.java
@@ -12,179 +12,24 @@
package org.dromara.hutool.core.codec.binary;
-import org.dromara.hutool.core.exception.HutoolException;
import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.text.StrUtil;
-import org.dromara.hutool.core.util.ByteUtil;
-import org.dromara.hutool.core.util.CharsetUtil;
import java.awt.Color;
import java.math.BigInteger;
-import java.nio.charset.Charset;
/**
* 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制,一般用数字0到9和字母A到F表示(其中:A~F即10~15)。
* 例如十进制数57,在二进制写作111001,在16进制写作39。
* 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的32,而不是十进制的20
*
- * 参考:https://my.oschina.net/xinxingegeya/blog/287476 + * + * 此工具类为16进制组合工具类,除了继承{@link Hex}实现编码解码外,提供其它转换类和识别类工具。 * * @author Looly - * @see Base16Codec + * @see Hex */ -public class HexUtil { - - // region ----- encode - /** - * 将字节数组转换为十六进制字符数组 - * - * @param data byte[] - * @return 十六进制char[] - */ - public static char[] encode(final byte[] data) { - return encode(data, true); - } - - /** - * 将字节数组转换为十六进制字符数组 - * - * @param str 字符串 - * @param charset 编码 - * @return 十六进制char[] - */ - public static char[] encode(final String str, final Charset charset) { - return encode(ByteUtil.toBytes(str, charset), true); - } - - /** - * 将字节数组转换为十六进制字符数组 - * - * @param data byte[] - * @param toLowerCase {@code true} 传换成小写格式 , {@code false} 传换成大写格式 - * @return 十六进制char[]。如果提供的data为{@code null},返回{@code null} - */ - public static char[] encode(final byte[] data, final boolean toLowerCase) { - if(null == data){ - return null; - } - return (toLowerCase ? Base16Codec.CODEC_LOWER : Base16Codec.CODEC_UPPER).encode(data); - } - - /** - * 将字节数组转换为十六进制字符串 - * - * @param data byte[] - * @return 十六进制String - */ - public static String encodeStr(final byte[] data) { - return encodeStr(data, true); - } - - /** - * 将字符串转换为十六进制字符串,结果为小写,默认编码是UTF-8 - * - * @param data 被编码的字符串 - * @return 十六进制String - */ - public static String encodeStr(final String data) { - return encodeStr(data, CharsetUtil.UTF_8); - } - - /** - * 将字符串转换为十六进制字符串,结果为小写 - * - * @param data 需要被编码的字符串 - * @param charset 编码 - * @return 十六进制String - */ - public static String encodeStr(final String data, final Charset charset) { - return encodeStr(ByteUtil.toBytes(data, charset), true); - } - - /** - * 将字节数组转换为十六进制字符串 - * - * @param data byte[] - * @param toLowerCase {@code true} 传换成小写格式 , {@code false} 传换成大写格式 - * @return 十六进制String - */ - public static String encodeStr(final byte[] data, final boolean toLowerCase) { - return StrUtil.str(encode(data, toLowerCase), CharsetUtil.UTF_8); - } - // endregion - - // region ----- decode - - /** - * 将十六进制字符数组转换为字符串,默认编码UTF-8 - * - * @param hexStr 十六进制String - * @return 字符串 - */ - public static String decodeStr(final String hexStr) { - return decodeStr(hexStr, CharsetUtil.UTF_8); - } - - /** - * 将十六进制字符数组转换为字符串 - * - * @param hexStr 十六进制String - * @param charset 编码 - * @return 字符串 - */ - public static String decodeStr(final String hexStr, final Charset charset) { - if (StrUtil.isEmpty(hexStr)) { - return hexStr; - } - return StrUtil.str(decode(hexStr), charset); - } - - /** - * 将十六进制字符数组转换为字符串 - * - * @param hexData 十六进制char[] - * @param charset 编码 - * @return 字符串 - */ - public static String decodeStr(final char[] hexData, final Charset charset) { - return StrUtil.str(decode(hexData), charset); - } - - /** - * 将十六进制字符串解码为byte[] - * - * @param hexStr 十六进制String - * @return byte[] - */ - public static byte[] decode(final String hexStr) { - return decode((CharSequence) hexStr); - } - - /** - * 将十六进制字符数组转换为字节数组 - * - * @param hexData 十六进制char[] - * @return byte[] - * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常 - */ - public static byte[] decode(final char[] hexData) { - return decode(String.valueOf(hexData)); - } - - /** - * 将十六进制字符数组转换为字节数组 - * - * @param hexData 十六进制字符串 - * @return byte[] - * @throws HutoolException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常 - * @since 5.6.6 - */ - public static byte[] decode(final CharSequence hexData) { - return Base16Codec.CODEC_LOWER.decode(hexData); - } - - // endregion - +public class HexUtil extends Hex{ // region ----- Color /** diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java index 25660653e..5d3eed7f8 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java @@ -14,8 +14,8 @@ package org.dromara.hutool.crypto; import org.bouncycastle.crypto.AlphabetMapper; import org.dromara.hutool.core.array.ArrayUtil; -import org.dromara.hutool.core.codec.binary.HexUtil; import org.dromara.hutool.core.codec.binary.Base64; +import org.dromara.hutool.core.codec.binary.Hex; import org.dromara.hutool.core.lang.Validator; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ByteUtil; @@ -536,7 +536,7 @@ public class SecureUtil { // issue#I90M9D // 某些特殊字符串会无法区分Hex还是Base64,此处使用系统属性强制关闭Hex解析 final boolean decodeHex = SystemUtil.getBoolean(HUTOOL_CRYPTO_DECODE_HEX, true); - return (decodeHex && Validator.isHex(key)) ? HexUtil.decode(key) : Base64.decode(key); + return (decodeHex && Validator.isHex(key)) ? Hex.decode(key) : Base64.decode(key); } /**