java - 从 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。
解决方案
不是答案
有一些问题,因此以答案的形式。
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.zip
ZipFile、一个 ZipInputStream 或从 zip 文件系统复制。这些是可以在互联网上找到的标准课程。
由于内容可能是纯文本,您可以先手动解压后硬编码。
如果您从 a 开始,byte[]
那么矩阵打印机可能需要 MS Latin 1 或Charset.fromName("Windows-1252")
. Latin-1、ISO-8859-1 或StandardCharsets.ISO_8859_1
具有从\u0080 - \u00BF
.
推荐阅读
- oauth-2.0 - 如何使用 Azure Functions 强制执行 AAD 应用程序角色授权?
- react-native - 使用 Jest 和酶测试 React Native 中的按钮单击
- mysql - 在 pythonanywhere 中将 sql 文件导入 MySQL
- javascript - 如何使用jquery获取数组值
- android - 在返回意图 ACTION_PICK 之前预览图像
- r - 如何使用 R 绘制基于分类/离散因子的分类变量的 PCA 替代方案?
- ios - 如何给精灵精确的触摸位置?
- azure - Azure SQL 数据库中的存储过程失败
- c - 如何将 swift Data 结构传递给 C 代码,反之亦然?
- c# - How to set a range for elements within an array in C#