From 9cea4833f937cd6dfb49299d0240215581c79188 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期二, 05 五月 2026 15:25:08 +0800
Subject: [PATCH] #
---
zy-acs-common/src/main/java/com/zy/acs/common/utils/QrCodeCodecSupport.java | 54 ++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/utils/QrCodeCodecSupport.java b/zy-acs-common/src/main/java/com/zy/acs/common/utils/QrCodeCodecSupport.java
index 0887618..0a4ddef 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/utils/QrCodeCodecSupport.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/utils/QrCodeCodecSupport.java
@@ -1,5 +1,7 @@
package com.zy.acs.common.utils;
+import com.zy.acs.framework.common.Cools;
+
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@@ -22,6 +24,16 @@
public static int qrCodeBytes() {
return config.bytes;
+ }
+
+ public static String normalize(String qrCode) {
+ if (Cools.isEmpty(qrCode)) {
+ throw new IllegalArgumentException("qrCode must not be empty");
+ }
+ if (config.mode == Mode.NUMERIC) {
+ return normalizeNumericValue(qrCode, config.bytes, config.displayLength);
+ }
+ return normalizeStringValue(qrCode, config.bytes, config.charset);
}
public static String decode(byte[] bytes, int pos) {
@@ -48,10 +60,7 @@
if (value.isEmpty()) {
value = "0";
}
- BigInteger numeric = new BigInteger(value);
- if (numeric.signum() < 0) {
- throw new IllegalArgumentException("qrCode must not be negative: " + qrCode);
- }
+ BigInteger numeric = parseUnsignedNumericValue(value, qrCode);
byte[] raw = numeric.toByteArray();
if (raw.length > 1 && raw[0] == 0) {
raw = Arrays.copyOfRange(raw, 1, raw.length);
@@ -65,15 +74,40 @@
}
private static byte[] toFixedStringBytes(String qrCode, int size, Charset charset) {
- String value = qrCode == null ? "" : qrCode;
- byte[] raw = value.getBytes(charset);
+ String value = normalizeStringValue(qrCode, size, charset);
+ return value.getBytes(charset);
+ }
+
+ private static String normalizeNumericValue(String qrCode, int size, int displayLength) {
+ BigInteger numeric = parseUnsignedNumericValue(qrCode, qrCode);
+ byte[] raw = numeric.toByteArray();
+ if (raw.length > 1 && raw[0] == 0) {
+ raw = Arrays.copyOfRange(raw, 1, raw.length);
+ }
if (raw.length > size) {
throw new IllegalArgumentException("qrCode exceeds configured byte size: " + qrCode);
}
- byte[] result = new byte[size];
- Arrays.fill(result, (byte) '0');
- System.arraycopy(raw, 0, result, size - raw.length, raw.length);
- return result;
+ return Utils.zeroFill(numeric.toString(), displayLength);
+ }
+
+ private static String normalizeStringValue(String qrCode, int size, Charset charset) {
+ String value = qrCode == null ? "" : qrCode.trim();
+ byte[] raw = value.getBytes(charset);
+ if (raw.length != size) {
+ throw new IllegalArgumentException("qrCode byte length must be " + size + ": " + qrCode);
+ }
+ return value;
+ }
+
+ private static BigInteger parseUnsignedNumericValue(String value, String originalValue) {
+ if (!value.chars().allMatch(Character::isDigit)) {
+ throw new IllegalArgumentException("qrCode must be numeric: " + originalValue);
+ }
+ BigInteger numeric = new BigInteger(value);
+ if (numeric.signum() < 0) {
+ throw new IllegalArgumentException("qrCode must not be negative: " + originalValue);
+ }
+ return numeric;
}
private static String stripPadding(String value) {
--
Gitblit v1.9.1