1

我正在使用长度很容易比 QRCode 可以处理的字符串生成 QR 码。我正在寻找有关尽可能小地编码这些字符串的算法的建议,或者证明字符串不能进一步缩小的证据。

由于我正在对一系列项目进行编码,因此我可以使用 ID 来表示它们并使用管道来描绘它们,如下面的查找表所示:

    function encodeLookUp(character){
        switch(character){
            case '0': return '0000';
            case '1': return '0001';
            case '2': return '0010';
            case '3': return '0011';
            case '4': return '0100';
            case '5': return '0101';
            case '6': return '0110';
            case '7': return '0111';
            case '8': return '1000';
            case '9': return '1001';
            case '|': return '1010';
            case ':': return '1011';
        }
        return false;
    }

使用这个表,我已经在进行 base 16 编码,因此原始字符串中的每个 32 个 ascii 字符都成为新字符串中的半个字符(实际上将长度减半)。

Starting String:  01251548|4654654:4465464 // ID1 | ID2 : ID3   demonstrates both pipes.
Bit String:  000000010010010100010101010010001010010001100101010001100101010010110100010001100101010001100100
Result String:  %H¤eFT´FTd // Half the length of the starting string.

然后这个新的ASCII码,根据QRCode规范进行翻译。

编辑:当前可编码的字符数量最多:384

澄清:ID 编号长度以及 ID 或管道的数量都是可变的,并且趋向于一个。我希望能够减少此算法,使其在“结果字符串”时平均包含最少数量的字符。

注意:结果字符串只是我用数据编码的二进制字符串的 ascii 表示,以符合标准 QRCode 规范和阅读器。

4

5 回答 5

0

作为回答我自己的问题的开始:

如果我从一串数字开始

我可以解析该字符串的模式并将这些模式保存在特殊符号中,这些符号能够占用我的霍夫曼树中的其他 4 个可用空间。

编辑:示例:起始字符串 12222345,结束字符串 12x345。其中 x 是一个符号,表示“将最后一个符号再重复 3 次”

于 2011-04-21T20:28:05.543 回答
0

使用该功能,您将失去大量空间(因为 4 位对于 12 种组合来说存储空间太大了)。

我将首先查看您的 ID 可能的最大长度并找到合适的存储块。

如果您以固定计数(例如 4 个 ID)连续存储这些项目。您最多需要 id_length*id_count,并且不需要使用任何分隔符。

编辑:再次根据您要写入的 ID 数量及其预期的最大长度,可能会有不同类型的编码来压缩它。我想到了 RLE(运行长度编码)。

于 2011-04-21T19:31:27.500 回答
0

如果您有相对非随机的数据,那么霍夫曼编码可能是一个很好的解决方案。

于 2011-04-21T19:44:56.887 回答
0

二维码支持二进制模式,这将是您存储 ID 的最有效方式。任何一个:

  1. 选择一个足以存储所有 ID 的长度(以字节为单位),并将 QR 码编码为一系列固定长度的整数。4 字节(32 位)是一个标准选择,应该涵盖可能的范围,或者
  2. 如果您希望能够对各种 ID 进行编码,但希望大多数值都很小,请使用可变长度编码方案。一个示例是使用每个字节的最低 7 位来存储整数,并使用最高有效位来指示是否还有其他字节。

另请注意,二维码可以比 384 个字符大很多!

编辑:不过,从您最初的问题来看,您编码的不仅仅是一系列整数 - 您至少有两种不同类型的分隔符。它们会出现在哪里以及在什么情况下?编码格式将取决于这些参数。

于 2011-04-22T03:43:21.407 回答
0

QR 码已经具有针对数字或字母数字数据进行优化的特殊编码模式。利用这些可能比发明一个方案更容易。

如果你要做一些定制的事情,我想你会发现很难打败像 gzip 压缩这样的东西。只需 gzip 字节,以字节模式对字节进行编码,然后在另一端解压缩。

于 2011-04-21T19:46:55.467 回答