diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/BCD.java b/hutool-core/src/main/java/cn/hutool/core/codec/BCD.java
index ecfb8e59f..026bd62ea 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/BCD.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/BCD.java
@@ -18,6 +18,7 @@ public class BCD {
* @return BCD
*/
public static byte[] strToBcd(String asc) {
+ Assert.notNull(asc, "ASCII must not be null!");
int len = asc.length();
final int mod = len % 2;
if (mod != 0) {
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Caesar.java b/hutool-core/src/main/java/cn/hutool/core/codec/Caesar.java
index c7278e4f3..b17700c0b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Caesar.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Caesar.java
@@ -1,5 +1,7 @@
package cn.hutool.core.codec;
+import cn.hutool.core.lang.Assert;
+
/**
* 凯撒密码实现
* 算法来自:https://github.com/zhaorenjie110/SymmetricEncryptionAndDecryption
@@ -19,6 +21,7 @@ public class Caesar {
* @return 加密后的内容
*/
public static String encode(final String message, final int offset) {
+ Assert.notNull(message, "message must be not null!");
final int len = message.length();
final char[] plain = message.toCharArray();
char c;
@@ -40,6 +43,7 @@ public class Caesar {
* @return 解密后的内容
*/
public static String decode(final String cipherText, final int offset) {
+ Assert.notNull(cipherText, "cipherText must be not null!");
final int len = cipherText.length();
final char[] plain = cipherText.toCharArray();
char c;
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java b/hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java
index 16803915a..bab6957ec 100755
--- a/hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java
@@ -1,5 +1,6 @@
package cn.hutool.core.codec;
+import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.CharPool;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil;
@@ -183,6 +184,7 @@ public class PercentCodec implements Encoder, Serializable {
* @return PercentCodec
*/
public static Builder of(final CharSequence chars) {
+ Assert.notNull(chars, "chars must not be null");
final Builder builder = of(new PercentCodec());
final int length = chars.length();
for (int i = 0; i < length; i++) {
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java b/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java
index 2eeb1508d..23ce39449 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/PunyCode.java
@@ -44,6 +44,7 @@ public class PunyCode {
* @throws UtilException 计算异常
*/
public static String encode(final CharSequence input, final boolean withPrefix) throws UtilException {
+ Assert.notNull(input, "input must not be null!");
int n = INITIAL_N;
int delta = 0;
int bias = INITIAL_BIAS;
@@ -126,6 +127,7 @@ public class PunyCode {
* @throws UtilException 计算异常
*/
public static String decode(String input) throws UtilException {
+ Assert.notNull(input, "input must not be null!");
input = StrUtil.removePrefixIgnoreCase(input, PUNY_CODE_PREFIX);
int n = INITIAL_N;
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java b/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java
index 541b130a7..78cf02e3b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java
@@ -1,10 +1,12 @@
package cn.hutool.core.codec;
+import cn.hutool.core.lang.Assert;
+
/**
* RotN(rotate by N places),回转N位密码,是一种简易的替换式密码,也是过去在古罗马开发的凯撒加密的一种变体。
- * 代码来自:https://github.com/orclight/jencrypt
+ * 代码来自:https://github.com/orclight/jencrypt
*
- * @author looly,shuzhilong
+ * @author looly, shuzhilong
* @since 4.4.1
*/
public class Rot {
@@ -30,11 +32,11 @@ public class Rot {
* Rot-13编码
*
* @param message 被编码的消息
- * @param isEnocdeNumber 是否编码数字
+ * @param isEncodeNumber 是否编码数字
* @return 编码后的字符串
*/
- public static String encode13(final String message, final boolean isEnocdeNumber) {
- return encode(message, 13, isEnocdeNumber);
+ public static String encode13(final String message, final boolean isEncodeNumber) {
+ return encode(message, 13, isEncodeNumber);
}
/**
@@ -42,15 +44,15 @@ public class Rot {
*
* @param message 被编码的消息
* @param offset 位移,常用位移13
- * @param isEnocdeNumber 是否编码数字
+ * @param isEncodeNumber 是否编码数字
* @return 编码后的字符串
*/
- public static String encode(final String message, final int offset, final boolean isEnocdeNumber) {
+ public static String encode(final String message, final int offset, final boolean isEncodeNumber) {
final int len = message.length();
final char[] chars = new char[len];
for (int i = 0; i < len; i++) {
- chars[i] = encodeChar(message.charAt(i), offset, isEnocdeNumber);
+ chars[i] = encodeChar(message.charAt(i), offset, isEncodeNumber);
}
return new String(chars);
}
@@ -85,6 +87,7 @@ public class Rot {
* @return 解码后的字符串
*/
public static String decode(final String rot, final int offset, final boolean isDecodeNumber) {
+ Assert.notNull(rot, "rot must not be null");
final int len = rot.length();
final char[] chars = new char[len];
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java
index 77eb4e6c7..06bf5226c 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java
@@ -1,10 +1,11 @@
package cn.hutool.extra.qrcode;
-import cn.hutool.swing.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.swing.img.ImgUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
+import com.google.zxing.datamatrix.encoder.SymbolShapeHint;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.Color;
@@ -44,6 +45,10 @@ public class QrConfig {
protected Image img;
/** 二维码中的Logo缩放的比例系数,如5表示长宽最小值的1/5 */
protected int ratio = 6;
+ /**
+ * DATA_MATRIX的符号形状
+ */
+ protected SymbolShapeHint shapeHint = SymbolShapeHint.FORCE_NONE;
/**
* 创建QrConfig
@@ -300,6 +305,17 @@ public class QrConfig {
return this;
}
+ /**
+ * 设置DATA_MATRIX的符号形状
+ *
+ * @param shapeHint DATA_MATRIX的符号形状
+ * @return this
+ */
+ public QrConfig setShapeHint(SymbolShapeHint shapeHint) {
+ this.shapeHint = shapeHint;
+ return this;
+ }
+
/**
* 转换为Zxing的二维码配置
*
@@ -331,6 +347,7 @@ public class QrConfig {
}
hints.put(EncodeHintType.ERROR_CORRECTION, value);
+ hints.put(EncodeHintType.DATA_MATRIX_SHAPE, shapeHint);
}
if (null != this.margin) {
hints.put(EncodeHintType.MARGIN, this.margin);
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java
index 397f7752a..b7da768a7 100755
--- a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java
@@ -1,10 +1,11 @@
package cn.hutool.extra.qrcode;
import cn.hutool.core.codec.Base64;
-import cn.hutool.swing.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
+import cn.hutool.swing.img.ImgUtil;
import com.google.zxing.BarcodeFormat;
+import com.google.zxing.datamatrix.encoder.SymbolShapeHint;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.junit.Assert;
import org.junit.Ignore;
@@ -75,8 +76,7 @@ public class QrCodeUtilTest {
@Test
@Ignore
public void generateAsBase64Test2() {
- final byte[] bytes = FileUtil.readBytes(
- new File("d:/test/qr.png"));
+ final byte[] bytes = FileUtil.readBytes(new File("d:/test/qr.png"));
final String encode = Base64.encode(bytes);
final String base641 = QrCodeUtil.generateAsBase64("https://hutool.cn/", new QrConfig(400, 400), "png", encode);
Assert.assertNotNull(base641);
@@ -84,16 +84,26 @@ public class QrCodeUtilTest {
@Test
@Ignore
- public void decodeTest3(){
+ public void decodeTest3() {
final String decode = QrCodeUtil.decode(ImgUtil.read("d:/test/qr_a.png"), false, true);
Console.log(decode);
}
@Test
- public void pdf417Test(){
+ public void pdf417Test() {
final BufferedImage image = QrCodeUtil.generate("content111", BarcodeFormat.PDF_417, QrConfig.of());
Assert.assertNotNull(image);
}
-
+ @Test
+ public void generateDataMatrixTest() {
+ final QrConfig qrConfig = QrConfig.of();
+ qrConfig.setShapeHint(SymbolShapeHint.FORCE_RECTANGLE);
+ final BufferedImage image = QrCodeUtil.generate("content111", BarcodeFormat.DATA_MATRIX, qrConfig);
+ Assert.assertNotNull(image);
+ final QrConfig config = QrConfig.of();
+ config.setShapeHint(SymbolShapeHint.FORCE_SQUARE);
+ final BufferedImage imageSquare = QrCodeUtil.generate("content111", BarcodeFormat.DATA_MATRIX, qrConfig);
+ Assert.assertNotNull(imageSquare);
+ }
}