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;
    }

このテーブルを使用して、私はすでに基数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またはパイプの数はどちらも可変であり、1に向かう傾向があります。このアルゴリズムを減らして、「結果文字列」になるまでに平均して最小量の文字を含めることができるようにしたいと考えています。

注:結果の文字列は、標準のQRCode仕様とリーダーに準拠するためにデータでエンコードしたバイナリ文字列のASCII表現にすぎません。

4

5 に答える 5

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

QRコードには、数字または英数字データ用に最適化された特別なエンコードモードがすでにあります。スキームを発明するよりも、これらを利用する方がおそらく簡単でしょう。

あなたが何かカスタムをするつもりなら、gzip圧縮のようなものを打ち負かすのは難しいと思うでしょう。バイトをgzipで圧縮し、バイトをバイトモードでエンコードして、もう一方の端で解凍するだけです。

于 2011-04-21T19:46:55.467 に答える
0

私自身の質問への答えの始まりとして:

数字の文字列から始める場合

その文字列を解析してパターンを探し、それらのパターンを、ハフマンツリーで使用可能な他の4つのスペースを占めることができる特別な記号で保持することができます。

編集:例:文字列12222345を開始し、文字列12x345を終了します。ここで、xは、「最後の記号をさらに3回繰り返す」という意味の記号です。

于 2011-04-21T20:28:05.543 に答える
0

QRコードはバイナリモードをサポートしており、これがIDを保存するための最も効率的な方法になります。また:

  1. すべてのIDを格納するのに十分な長さ(バイト単位)を選択し、QRコードを一連の固定長整数としてエンコードします。4バイト(32ビット)は、可能性のある範囲をカバーする必要がある標準的な選択です。
  2. 広範囲のIDをエンコードできるようにしたいが、ほとんどの値が小さいと予想される場合は、可変長のエンコード方式を使用してください。1つの例は、各バイトの下位7ビットを使用して整数を格納し、最上位ビットを使用してさらにバイトがあるかどうかを示すことです。

また、QRコードは384文字よりもはるかに大きくなる可能性があることに注意してください。

編集:しかし、元の質問から、一連の整数以上のものをエンコードしているように見えます-少なくとも2つの異なるタイプの区切り文字があります。それらはどこに、どのような状況で現れることができますか?エンコード形式はこれらのパラメータに依存します。

于 2011-04-22T03:43:21.407 に答える