- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个绣花输入和输出python模块EmbroidePy/pyembroidery,而HUS和VIP是两种相关的,旧的和流行的绣花格式,它们使用特定的已失效压缩格式,特别是ArchiveLib, AL_GREENLEAF_LEVEL_4
。许多绣花软件套件使用旧的.dll文件al21mfc.dll
来利用正确的压缩。包括.dll文件不是启动程序,但是似乎没有任何合理的方法来无缝模拟已失效的压缩格式。
Embroidermodder团队有一个可以接受的许可C ++刺绣读写库,实际上是在本地实现的,emb-compress,我也想这样做。
我本来希望能够在python中甚至在Java中压缩和解压缩这些元素。我更喜欢可读的代码,但这并不是遥不可及的要求。
但是,有问题。libembroidery
中的C ++代码显然已反编译,看起来像乱七八糟的东西,仅使源代码难于移植。
ArchiveLib源代码与产品本身一起发布,但是无法找到。有了它可能会打开一些方法,以了解特定的需求,从而在python中本地实现它。
解决方案不必太漂亮。解决方案不需要很快。我已经考虑过将C ++代码编译为某种字节代码,以在python中实现虚拟cpu之类的事情。或使用其他程序来移植看起来很乱的代码,这会增加乱码的级别,或者手动执行(但是它总是很快让我迷失了)。我在网络的最暗处寻找了原始源代码。而且我提出了一些建议。
似乎应该有足够的钱可以使某些事情起作用,但是每个想法都比下一个想法更难,不实用。有什么我想念的东西或可以迅速使这些解决方案之一起作用的想法吗?或其他可行的解决方案?
最佳答案
ArchiveLib压缩是执行ARJ压缩的Robert Jung的子许可产品。 ARJ和ArchiveLib中使用了相同的方案,并且专利保护自此已过期。
它发送压缩的霍夫曼表,通过读取n个huffman_code_length来构建该表。检查它们是否解决了平衡的霍夫曼树。这些从最长的代码字到最短的代码字进行排序,并且绑定条目将变为最低值。
因此,如果值的长度为4、8、2、2。则使用代码字0、10、110、111给出这些8、4、2、2。给出的顺序反映了它们的位置。因此,第一个条目为10,第二个为0,第三个为110,然后是第111个。由于这两个关系并列,因此按接收到的顺序应用它们。
16个字节读取块以传达符号数。其后是字符长度表。这是霍夫曼编码的。然后,使用字符长度表来构建字符表。使用霍夫曼表构建字符霍夫曼表。然后,发送第三个距离表,该表给出读取窗口内回溯的值。
字符长度表。
5位计数数据。可以传送0到32的值。如果为零,则读取另一个5位值,该值用于所有值。
对于计数中的每个值,我们读取一个可变长度。在索引3处有特殊值(给定第4个值)的前缀是2位,该位在索引中向前跳0到3个值。这些跳过的值被视为计数的一部分。前三个条目是字符表中的特殊命令代码。
然后,这将提供多达32个不同的霍夫曼码长度值。
字符表。
9位计数。这意味着它可以提供从0到511的值。如果为0,则所有值都是紧随其后的9位。
条目数是实际填写表格的值。因此,如果为4,则在511条目表中将有4个不同的非零条目。
编码的数据是如何跳过或填充提供的相关数据。 0表示我们在表序列中设置一个零。 1表示我们读取4位并将3加到该值上,然后将那么多表条目清零。 2表示我们读取9位,然后向该值加20,然后在许多表条目中将其清零。对于任何大于该值的值,我们减去2并将其长度简单地放在表中。
结果是一个列表,列出了多达511个元素的所有必需代码的长度(任何未获取值的条目均为0)。然后将其发送到霍夫曼表构建算法,以检查其有效性并构建表。这会将霍夫曼代码分配给0到511之间的令牌。
距离霍夫曼
5位计数。如果为零,则为所有值给出后续的5位数字。
每个条目读取一个可变长度的数据值。这导致长度为0-32。然后将这些用于构建相关的霍夫曼表。
该表将具有由霍夫曼表定义的最多32个不同的整数值。
可变长度数据。
3位值。如果不是7,则返回该值。
如果7读取0到13之间的其他字节,直到找到一个非值。因此,如果值小于7,则使用该值。如果大于7,则每增加1表示值增加1。所以11110是8。111110是9。最多13位。给出的值为0到20。介于3到16位之间。
减压。
实际的减压意味着读取块和表。然后使用字符表和距离表(如果需要)压缩流。将对照字符表检查每个值以提供令牌。如果值为0-255,则为文字。如果值为510,则表示结束命令。如果该值大于255,则对应于返回窗口的指针。大于255的值对应于(v-253)个字符的字符串。也就是说256表示我们正在从窗口读取3个字符。 257表示4个字符。最多509,这意味着我们正在从窗口读取255个字符。如果我们从查找中读取a,则流上的下一个值是使用距离霍夫曼表读取的向后距离。
压缩。
任何适合解压缩方案的压缩方案都可以使用。它如何找到编码的东西是无关紧要的。关于ARJ的专利只是简单地快速压缩事物的方式,这不是什么大问题。但是,一种有趣的方法是根本不压缩任何东西,而只是强制通过标头执行null操作。
编写空操作压缩的示例。
16位块大小。如果需要超过32k元素,则必须编写另一个块。
写作字符长度霍夫曼。
5个字节:00000,我们有0个条目。 1个长度。他们都是8。
5个字节:01010,所有值均为10,表示长度为8。
字符长度霍夫曼只返回10。
写作角色霍夫曼。
9位:100000000,256个条目。
所有条目将查询“字符长度”霍夫曼,并获得值10,即8。
字符霍夫曼表将具有256个8位条目。这将建立一个文字表,其中每个字节都完全相等。由于存在256个并列条目,因此它们将从最低元素中首先获取。
距离霍夫曼。 (我们从不使用此功能)。
5位:00000无条目。
5位:00000任何值都无关紧要。
这使得编写我们的文字表需要29位。但是,为使此方法非常有用,我们希望它精确地划分8位。我们可以通过更改距离霍夫曼来做到这一点,因为所有值都是文字,所以我们从未使用过。
5位:00001 1距离霍夫曼。
3位:111,我们的可变长度值等于或大于7。
5位:11110,我们在这7中添加4,长度为11。但是实际上,我们在填充。
(10)+(9)+(5 + 3 + 5)= 32位。
0b00000010101000000000000111111110
可以将其存储为单个整数:0x02A001FE
因此,对于compress
,我们可以简单地给出块的大小,然后给出0x02A001FE
和未压缩的数据。它将被视为已压缩。由于我实际上不能建议使用几乎完全无效的压缩方案。
关于python - 在Python中正确实现ArchiveLib压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56464710/
我是一名优秀的程序员,十分优秀!