八月闲趣之报文
初
无意间得到一段报文,起了好奇心。检索得知,这段报文属于条码打印机的控制指令ZPL,特点为以^
或~
开头,(此类指令还有ZPL、EPL、CPCL,TSPL,ESC/POS,等等)。
按ZPL手册,逐项对比,指定坐标放置对象,唯~DGR(Download Graphics),涉及一个Z64特性。
举例如下。
~DGR:LOGO.GRF,19600,70,:Z64:eJzt17sJACAUA8C3iftv5wbaWgmCf+7aQOokAgBYI5WurS0AAPzBxgQAAN7n2QAAANxn7GW1UZ7eAgAAAAAAAACcUQHgOgng:3EC5
Z64
Z64,格式为:id:encoded_data:crc
。
先 CRC:检查是否为 3EC5.
再 encoded_data:先base64,再解压。
The second encoding, known as Z64, first compresses the data using the LZ77 algorithm to reduce
its size. (This algorithm is used by the PKWARE® compression program PKZIP™ and is integral to
the PNG graphics format.) The compressed data is then encoded using the MIME Base64 scheme
as described above.
图像
根据ZPL手册,~DGd:o.x,t,w,data
,及data解释 (Each character represents a horizontal nibble of four dots),可知,这里存在一个图像,总大小为19600 bytes,每行70 bytes,即,560×280。
Bitmap
将像素数据放入Bitmap中,可以得到图像。
以 C# 处理,Bitmap 格式为 PixelFormat.Format1bppIndexed ,选择 Color Palette,逐行复制,注意 Stride 需按 4 字节对齐。
图像文件之 BMP
此处的 20160,即 280×72,每行72字节(70字节,以4对齐)。
图像文件之 PNG
此处 IDAT 解压后,得到 19880,即 280×71,每行71字节(70字节,额外字节 filter type byte)。
参考
- Programming Guide For ZPL II, https://support.zebra.com/cpws/docs/zpl/zpl_manual.pdf
- Types of Bitmaps - Windows , https://learn.microsoft.com/zh-cn/dotnet/desktop/winforms/advanced/types-of-bitmaps
- PNG Specification (Third Edition) - W3C, https://www.w3.org/TR/png-3/
更多
- ZLib Decompress Online - Code Beautify (需要注意 String, Blob 带来的二进制文件问题)
- Hex to Base64 - Guru
- github.com/metafloor/zpl-image (可预览)