我试图理解使用爱普生ESCP2打印命令“ESCP2”用于压缩值=1的算法。我有一个原始打印文件的十六进制转储,在某种程度上,它看起来像下面的十六进制文件(注意小endian格式问题)。
000006a 1b ( U 05 00 08 08 08 40 0b
units; (page1=08), (vt1=08), (hz1=08), (base2=40 0b=0xb40=2880)
...
00000c0 691b 0112 6802 0101 de00
esc i 12 01 02 68 01 01 00
print color1, compress1, bits1, bytes2, lines2, data...
color1 = 0x12 = 18 = light cyan
compress1 = 1
bits1 (bits/pixel) = 0x2 = 2
bytes2 is ??? = 0x0168 = 360
lines2 is # lines to print = 0x0001 = 1
00000c9 de 1200 9a05 6959
00000d0 5999 a565 5999 6566 5996 9695 655a fd56
00000e0 1f66 9a59 6656 6566 5996 9665 9659 6666
00000f0 6559 9999 9565 6695 9965 a665 6666 6969
0000100 5566 95fe 9919 6596 5996 5696 9666 665a
0000110 5956 6669 0456 1044 0041 4110 0040 8140
0000120 9000 0d00
1b0c 1b40 5228 0008 5200 4d45
FF esc @ esc ( R 00 REMOTE1我遇到的困难是如何解码数据,从00000c9开始,给定2位/像素和360的计数。据我所知,这是某种形式的tiff或rle编码,但我无法以一种有意义的方式对它进行解码。输出由GIMP的gutenprint插件制作。
任何帮助都将不胜感激。
发布于 2022-03-02 22:48:45
字节计数不是输入流中字节的计数;它是将输入流中的字节展开为未压缩形式的字节数。因此,当展开时,总共应该有360字节。输入字节被解释为要跟随的字节计数(如果为正,则计数为字节值+1 );如果计数为字节值+1的次数,则接下来的字节应该再次展开+1。末尾的0D是整个行的终止行返回。
尽管单个像素/喷嘴控件每个仅为2位,但输入流仅被视为整个字节的字符串。因此,对像3喷嘴序列这样的东西使用重复计数是不可能的;重复计数必须始终指定一个完整的字节4喷嘴组合。
然后,上面的示例指定:
0xde00 => repeat 0x00 35 times
0x12 => use the next 19 bytes as is
0xfd66 => repeat 0x66 4 times
0x1f => use the next 32 bytes as is
etc.https://stackoverflow.com/questions/71317225
复制相似问题