- 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/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!