JMeter下文本转二维码及逆向解析的技术实现咨询
使用ZXing实现二维码与Base64的互转及文本解析
依赖配置
Maven(pom.xml)
<dependencies> <!-- ZXing核心库 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency> <!-- ZXing JavaSE扩展(处理图片生成/解析) --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.1</version> </dependency> <!-- 图片IO支持(处理BufferedImage转字节数组) --> <dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-core</artifactId> <version>1.4.0</version> </dependency> <!-- 命令行参数解析(可选,用于快速测试) --> <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.78</version> </dependency> </dependencies>
Gradle(build.gradle)
dependencies { implementation 'com.google.zxing:core:3.4.1' implementation 'com.google.zxing:javase:3.4.1' implementation 'com.github.jai-imageio:jai-imageio-core:1.4.0' implementation 'com.beust:jcommander:1.78' }
核心功能实现
1. 文本生成二维码并转为Base64
将目标文本(如你提供的示例字符串)生成二维码图片,再编码为Base64字符串,可直接用于API返回:
import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; public class QRCodeBase64Utils { // 生成二维码的尺寸(可根据文本长度调整) private static final int QR_CODE_SIZE = 500; public static String textToQRCodeBase64(String text) throws WriterException, IOException { // 1. 生成二维码矩阵 QRCodeWriter writer = new QRCodeWriter(); BitMatrix bitMatrix = writer.encode( text, BarcodeFormat.QR_CODE, QR_CODE_SIZE, QR_CODE_SIZE ); // 2. 将矩阵转为BufferedImage并输出为字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream); // 3. 编码为Base64字符串(可选添加data URI前缀用于浏览器直接显示) byte[] imageBytes = outputStream.toByteArray(); return Base64.getEncoder().encodeToString(imageBytes); // 浏览器显示用:return "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes); } }
2. Base64解码为二维码并解析文本
将API返回的Base64字符串解码为二维码图片,再解析出原始文本:
import com.google.zxing.BinaryBitmap; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Base64; public class QRCodeBase64Utils { // ... 保留上面的textToQRCodeBase64方法 ... public static String qrCodeBase64ToText(String base64Str) throws IOException, NotFoundException { // 1. 移除可能的data URI前缀(如果存在) if (base64Str.startsWith("data:image/")) { base64Str = base64Str.split(",")[1]; } // 2. 解码Base64为字节数组并转为图片 byte[] imageBytes = Base64.getDecoder().decode(base64Str); BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes)); // 3. 解析二维码文本 BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer( new BufferedImageLuminanceSource(image) )); Result result = new MultiFormatReader().decode(bitmap); return result.getText(); } }
3. 命令行测试工具(基于JCommander)
如果需要快速验证功能,可编写命令行工具支持生成/解析两种模式:
import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.google.zxing.WriterException; import com.google.zxing.NotFoundException; import java.io.IOException; public class QRCodeCli { @Parameter(names = {"-g", "--generate"}, description = "生成二维码Base64,后跟目标文本") private String generateText; @Parameter(names = {"-p", "--parse"}, description = "解析二维码Base64,后跟Base64字符串") private String parseBase64; public static void main(String[] args) throws WriterException, IOException, NotFoundException { QRCodeCli cli = new QRCodeCli(); JCommander.newBuilder() .addObject(cli) .build() .parse(args); if (cli.generateText != null) { String base64 = QRCodeBase64Utils.textToQRCodeBase64(cli.generateText); System.out.println("生成的二维码Base64:\n" + base64); } else if (cli.parseBase64 != null) { String text = QRCodeBase64Utils.qrCodeBase64ToText(cli.parseBase64); System.out.println("解析出的文本:\n" + text); } else { System.out.println("请指定 -g 生成或 -p 解析参数"); } } }
注意事项
- 纠错级别:针对长文本(如示例字符串),建议添加高纠错级别避免扫描失败,修改生成逻辑:
import com.google.zxing.EncodeHintType; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.util.HashMap; import java.util.Map; // 在textToQRCodeBase64方法中添加: Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, QR_CODE_SIZE, QR_CODE_SIZE, hints); - Base64格式:确保API返回的Base64为纯图片数据,代码已兼容带data URI前缀的情况。
- 图片格式:示例使用PNG,可改为JPG等,只需修改
MatrixToImageWriter.writeToStream的第二个参数。
内容的提问来源于stack exchange,提问作者FeelGood
相关产品推荐
相关产品推荐

