首页 > 解决方案 > 从 Java 中的 ZIP 字符串生成数据矩阵

问题描述

我正在尝试使用 Java 中的 Zxing 从 zip 字符串生成数据矩阵,结果是 java.lang.IllegalArgumentException:消息包含 ISO-8859-1 编码之外的字符。

代码是:

byte[] bytesOfZIP= (byte[])statD.returnObj; // here is the zipped content
String texto = new String(bytesOfZIP, "UTF8");
DataMatrixWriter barcodeWriter = new DataMatrixWriter();
BitMatrix bitMatrix = barcodeWriter.encode(texto, BarcodeFormat.DATA_MATRIX, 400, 400);// exception appears at this line
BufferedImage bi = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);
byte[] fbytes = baos.toByteArray();

我正在寻找任何解决方案来使用这些特殊字符对 ZIP 文件进行编码,而不必使用 Zxing。

标签: javazxing

解决方案


不是答案

有一些问题,因此以答案的形式。

byte[] bytesOfZIP = (byte[])statD.returnObj; // here is the zipped content

一个Object(or char[], or String) 不能是byte[]数组的大小写。

String texto = new String(bytesOfZIP, "UTF8");

这将编译,但正式名称是"UTF-8"并且如前所述,StandardCharsets.UTF_8会更好(不UnsupportedEncodingException,因为 UTF-8m 是标准的,始终可用)。但是bytesOfZIP,绝不是需要特殊格式的 UTF-8 文本。事实上,二进制数据永远不应该用 2 字节字符的字符串压入。它需要两次转换为 Unicode,双倍内存,并且几乎肯定会损坏。

DataMatrixWriter barcodeWriter = new DataMatrixWriter();
BitMatrix bitMatrix = barcodeWriter.encode(texto, BarcodeFormat.DATA_MATRIX, 400, 400);

BufferedImage bi = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);
byte[] fbytes = baos.toByteArray();

JPEG(.jpg、.jpeg)是一种有损压缩。对于黑白条形码,请尝试使用 png。

解决方案

解压首先要检查格式: atest.txt.gz会使用GZipInputStream. 一个test.zipZipFile、一个 ZipInputStream 或从 zip 文件系统复制。这些是可以在互联网上找到的标准课程。

由于内容可能是纯文本,您可以先手动解压后硬编码。

如果您从 a 开始,byte[]那么矩阵打印机可能需要 MS Latin 1 或Charset.fromName("Windows-1252"). Latin-1、ISO-8859-1 或StandardCharsets.ISO_8859_1具有从\u0080 - \u00BF.


推荐阅读