Skip to content

Commit

Permalink
新增多个工具类模块,包括:Md5Tool、HexTool 等;
Browse files Browse the repository at this point in the history
  • Loading branch information
xuxueli committed Dec 15, 2024
1 parent 2e43c45 commit e2e0326
Show file tree
Hide file tree
Showing 5 changed files with 234 additions and 0 deletions.
3 changes: 3 additions & 0 deletions doc/XXL-TOOL官方文档.md
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,9 @@ logger.info(text);
- 3、【完善】工具类单测完善;
- 4、【升级】升级依赖版本,如slf4j、poi、spring、gson…等。

### 3.7 v1.3.2 Release Notes[迭代中]
- 1、【新增】新增多个工具类模块,包括:Md5Tool、HexTool 等;


### TODO LIST
- excel模块:大数据导出,流式导入导出;
Expand Down
135 changes: 135 additions & 0 deletions src/main/java/com/xxl/tool/encrypt/HexTool.java
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;
}

}
53 changes: 53 additions & 0 deletions src/main/java/com/xxl/tool/encrypt/Md5Tool.java
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);
}*/

}
24 changes: 24 additions & 0 deletions src/test/java/com/xxl/tool/test/encrypt/HexToolTest.java
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);
}

}
19 changes: 19 additions & 0 deletions src/test/java/com/xxl/tool/test/encrypt/Md5ToolTest.java
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);
}

}

0 comments on commit e2e0326

Please sign in to comment.