-
-
Notifications
You must be signed in to change notification settings - Fork 169
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
234 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
package com.xxl.tool.encrypt; | ||
|
||
import java.nio.charset.StandardCharsets; | ||
|
||
/** | ||
* hex tool | ||
* | ||
* @author xuxueli 2024-12-15 | ||
*/ | ||
public final class HexTool { | ||
|
||
// ---------------------- constants ---------------------- | ||
|
||
/** | ||
* Table for HEX to DEC byte translation. | ||
*/ | ||
private static final int[] DEC = { 00, 01, 02, 03, 04, 05, 06, 07, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, | ||
14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | ||
-1, 10, 11, 12, 13, 14, 15, }; | ||
|
||
|
||
/** | ||
* Table for DEC to HEX byte translation. | ||
*/ | ||
private static final byte[] HEX = | ||
{ (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', | ||
(byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }; | ||
|
||
|
||
/** | ||
* Table for byte to hex string translation. | ||
*/ | ||
private static final char[] hex = "0123456789abcdef".toCharArray(); | ||
|
||
|
||
// ---------------------- Static Methods ---------------------- | ||
|
||
public static int getDec(int index) { | ||
// Fast for correct values, slower for incorrect ones | ||
try { | ||
return DEC[index - '0']; | ||
} catch (ArrayIndexOutOfBoundsException ex) { | ||
return -1; | ||
} | ||
} | ||
|
||
|
||
public static byte getHex(int index) { | ||
return HEX[index]; | ||
} | ||
|
||
|
||
public static String toHexString(char c) { | ||
// 2 bytes / 4 hex digits | ||
StringBuilder sb = new StringBuilder(4); | ||
|
||
sb.append(hex[(c & 0xf000) >> 12]); | ||
sb.append(hex[(c & 0x0f00) >> 8]); | ||
|
||
sb.append(hex[(c & 0xf0) >> 4]); | ||
sb.append(hex[(c & 0x0f)]); | ||
|
||
return sb.toString(); | ||
} | ||
|
||
|
||
// ---------------------- tool ---------------------- | ||
|
||
/** | ||
* byte to hex | ||
* | ||
* @param input | ||
* @return | ||
*/ | ||
public static String toHex(String input) { | ||
return byteToHex(input.getBytes(StandardCharsets.UTF_8)); | ||
} | ||
/** | ||
* byte to hex | ||
* | ||
* @param bytes | ||
* @return | ||
*/ | ||
public static String byteToHex(byte[] bytes) { | ||
if (null == bytes) { | ||
return null; | ||
} | ||
|
||
StringBuilder sb = new StringBuilder(bytes.length << 1); | ||
for (byte aByte : bytes) { | ||
sb.append(hex[(aByte & 0xf0) >> 4]).append(hex[(aByte & 0x0f)]); | ||
} | ||
|
||
return sb.toString(); | ||
} | ||
|
||
/** | ||
* hex to byte | ||
* | ||
* @param input | ||
* @return | ||
*/ | ||
public static String fromHex(String input) { | ||
return new String(hexToByte(input), StandardCharsets.UTF_8); | ||
} | ||
|
||
/** | ||
* hex to byte | ||
* | ||
* @param input | ||
* @return | ||
*/ | ||
public static byte[] hexToByte(String input) { | ||
if (input == null) { | ||
return null; | ||
} | ||
|
||
if ((input.length() & 1) == 1) { | ||
throw new IllegalArgumentException("Odd number of characters"); | ||
} | ||
|
||
char[] inputChars = input.toCharArray(); | ||
byte[] result = new byte[input.length() >> 1]; | ||
for (int i = 0; i < result.length; i++) { | ||
int upperNibble = getDec(inputChars[2 * i]); | ||
int lowerNibble = getDec(inputChars[2 * i + 1]); | ||
if (upperNibble < 0 || lowerNibble < 0) { | ||
throw new IllegalArgumentException("None hex character"); | ||
} | ||
result[i] = (byte) ((upperNibble << 4) + lowerNibble); | ||
} | ||
return result; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package com.xxl.tool.encrypt; | ||
|
||
import java.nio.charset.StandardCharsets; | ||
import java.security.MessageDigest; | ||
|
||
/** | ||
* md5 tool | ||
* | ||
* @author xuxueli 2024-12-15 | ||
*/ | ||
public abstract class Md5Tool { | ||
|
||
private static final String MD5_ALGORITHM_NAME = "MD5"; | ||
|
||
private static final char[] HEX_CHARS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; | ||
|
||
/** | ||
* calculate md5 for input | ||
* | ||
* @param input | ||
* @return | ||
*/ | ||
public static String md5(String input) { | ||
return md5(input.getBytes(StandardCharsets.UTF_8)); | ||
} | ||
|
||
/** | ||
* calculate md5 for input | ||
* | ||
* @param input 输入字节数组 | ||
* @return MD5摘要的十六进制字符串 | ||
*/ | ||
public static String md5(byte[] input) { | ||
try { | ||
MessageDigest md = MessageDigest.getInstance(MD5_ALGORITHM_NAME); | ||
byte[] digest = md.digest(input); | ||
return HexTool.byteToHex(digest); | ||
} catch (Exception e) { | ||
throw new IllegalStateException("Md5Tool#md5 error, input:"+ input, e); | ||
} | ||
} | ||
|
||
/*private static String bytesToHex(byte[] bytes) { | ||
char[] hexChars = new char[bytes.length * 2]; | ||
for (int i = 0; i < bytes.length; i++) { | ||
int v = bytes[i] & 0xFF; | ||
hexChars[i * 2] = HEX_CHARS[v >>> 4]; | ||
hexChars[i * 2 + 1] = HEX_CHARS[v & 0x0F]; | ||
} | ||
return new String(hexChars); | ||
}*/ | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package com.xxl.tool.test.encrypt; | ||
|
||
import com.xxl.tool.encrypt.HexTool; | ||
import org.junit.jupiter.api.Assertions; | ||
import org.junit.jupiter.api.Test; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
public class HexToolTest { | ||
private static Logger logger = LoggerFactory.getLogger(HexToolTest.class); | ||
|
||
@Test | ||
public void test(){ | ||
String input = "xxl-tool"; | ||
String output = HexTool.toHex(input); | ||
logger.info("input: {}, output: {}", input, output); | ||
|
||
String input2 = HexTool.fromHex(output); | ||
logger.info("calculate input2: {}", input2); | ||
|
||
Assertions.assertEquals(input, input2); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package com.xxl.tool.test.encrypt; | ||
|
||
import com.xxl.tool.encrypt.Md5Tool; | ||
import org.junit.jupiter.api.Test; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
public class Md5ToolTest { | ||
private static Logger logger = LoggerFactory.getLogger(Md5ToolTest.class); | ||
|
||
@Test | ||
public void test(){ | ||
String input = "test"; | ||
|
||
String output = Md5Tool.md5(input); | ||
logger.info("input:{}, md5:{}", input, output); | ||
} | ||
|
||
} |