【问题标题】:Need help on implementing LZW on a ASCII text file在 ASCII 文本文件上实现 LZW 需要帮助
【发布时间】:2014-04-23 23:18:13
【问题描述】:

我正在尝试实现 LZW 来压缩基于 ASCII 的文本文件,我需要帮助。

假设我有一个文本文件,上面写着“BABAABAAAA”,我使用我的代码使用 LZW 算法对其进行压缩。结果的输出将写入一个文本文件,结果

66|65|256|257|65|260|65

现在的问题是,压缩文件的大小会比原始文件大,因为它将代码的每个字符都计为单个字符,而不是将每个代码都计为单个整数。因此,它不会将 65 读取为 01000001,而是将 65 视为 2 个 ascii 字符,即 00110110 (6) 00110101 (5)。这还不算标记('|')。

【问题讨论】:

    标签: php algorithm lzw


    【解决方案1】:

    在将某些文本转换为整数系列后,例如66|65|256,您不应该在文本模式下将其作为一系列 9 个字符写入文件。您应该以二进制模式打开输出文件并以二进制形式写入数字(根本不要写|之类的分隔符)。

    在 LZW 的情况下,有两种方法:要么使用固定二进制宽度,从而限制字典的大小,要么实现(稍微难一点)可变宽度版本,其中每个数字使用与NEXT 免费字典键。

    回到您的示例,固定宽度为 9 位的66|65|256|257|65|260|65 为您提供7 * 9 = 63 位,即8 字节。

    【讨论】:

    • 嗯,我如何使用 PHP 将其编写为二进制文件?
    • 实际上 PHP 对于该算法来说是一个奇怪的选择。天真的方法是首先将整数系列转换为布尔值系列(位表示),然后您可以将其拆分为 8 字节并写入 fopen($path, 'wb')
    • 你是说先将它们转换成二进制文件? 65 = 01000001 我不明白如何将 01000001 写入二进制文件并读取它。对不起,我以前从未处理过二进制文件,我还是个新手
    • 我可以举一个二进制文件的例子吗? @Batsosz
    • 每个文件都是二进制文件。二进制不是一种文件,而是一种查看文件的方式。每个文件都是一个位序列。二进制模式仅意味着您不想将字节解释为某些编码的字符,而是数字(从 00FF 十六进制)。
    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多