从 Java 中的 ZIP 字符串生成数据矩阵

Generating data matrix from a ZIP string in Java

我正在尝试在 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 不一定。

您应该尝试用“StandardCharsets.UTF_8”替换“UTF8”。因为我认为“UTF8”不是设置字符串字符集的正确方法。

没有答案

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

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

Object(或char[],或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。

解决方案

解压首先要检查格式:test.txt.gz会使用GZipInputStreamtest.zip ZipFile、ZipInputStream 或从 zip 文件系统复制。这些是可在互联网上找到的标准 类。

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

如果您以 byte[] 开头,则矩阵打印机可能需要 MS Latin 1 或 Charset.fromName("Windows-1252")。 Latin-1、ISO-8859-1 或 StandardCharsets.ISO_8859_1 的禁止控制范围为 \u0080 - \u00BF.