将字符串编码为小尺寸以生成QRCode

时间:2011-04-21 19:12:57

标签: javascript algorithm encoding qr-code

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

由于我正在编码一系列项目,我可以使用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;
    }

使用此表我已经在进行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.

然后根据QRCode规范翻译这个新的ascii代码。

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

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

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

5 个答案:

答案 0 :(得分:0)

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

我首先查看ID的最大长度,然后找到合适的存储块。

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

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

答案 1 :(得分:0)

如果您有相对非随机的数据,Huffman encoding可能是一个很好的解决方案。

答案 2 :(得分:0)

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

如果你要做一些自定义的事情,我认为你会发现很难击败像gzip压缩这样的东西。只需gzip字节,在字节模式下编码字节,然后在另一端解压缩。

答案 3 :(得分:0)

作为我自己问题答案的开头:

如果我从一串数字开始

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

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

答案 4 :(得分:0)

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

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

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