2

私は現在、1Dバーコード(構成設定)からキーと値のペアを取得できる必要があるWindowsMo​​bile用のアプリケーションを作成しています。スキャンする必要のあるバーコードが少ないほど、優れています。サンプル入力:

------------------------------
| Key | Value                |    
------------------------------
| 12  | Söme UTF-8 Strîng    |
|  9  | & another string     |
------------------------------

私は次のアルゴリズムを考えました:

1.キーと値のペアを連結し、Base64で値をエンコードします

だから私たちは次のようなものを得るでしょう12=U8O2bWUgVVRGLTggU3Ryw65uZw==&9=JiBhbm90aGVyIHN0cmluZw==

2.ハフマン符号化を使用してデータを圧縮します

これには固定のハフマンツリーを使用します。データを圧縮するのに役立つ次の情報を使用します。

-------------------------------------------
| Enties                       | Priority |    
-------------------------------------------
| =, &                         | High     |
| 0-9                          | Medium   |
| 5-bit Base64 Words (w/o 0-9) | Low      |
-------------------------------------------

3.エンコードされたデータからコード128Bバーコードを生成します

ハフマンアルゴリズムによって生成されたビットストリームにBase96エンコーディングを適用して、コード128Bバーコード内で使用できるASCII文字を取得します。結果の文字列を必要に応じて複数のバーコードに分割します。

この手順をコーディングすることは私にとって問題にはなりませんが、アルゴリズムの効率と設計についてフィードバックをお願いします。

質問

  • どこかでより良い圧縮/より短い文字列の可能性を失っていますか?
  • ランダムなUTF8エンコードデータを圧縮するためのより良い方法はありますか?
  • エンコードされたデータに動的ハフマンテーブルを埋め込む必要がありますか?
  • コード128Bの圧縮をどのように考慮に入れることができますか(a0はaよりも少ないスペースを必要とします&)?
4

3 に答える 3

2

簡単な方法の1つは、code128に直接マップされた64文字すべてを定義することです。これにより、30〜40の使用可能なコード128スロットが残ります。残りのスロットでは、いくつかの二重文字を定義します。== =&0 = 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9 =&0&1&2&2&5&5&6&7&8&9(最後の文字を繰り返す)= =(次の文字を2倍にする)&(次の2倍キャラクター)

于 2013-03-09T20:16:27.653 に答える
1

たくさん遊んだりいじったりした後、私たちは最終的にこのアプローチを選択します:

1.設定をバイトストリームにエンコードします

フィールド値は、各フィールドのヘッダーを使用してバイトストリームにシリアル化されます。ヘッダーは1バイトを消費し、フィールドのIDと、転送するデータの量を減らすのに役立ついくつかのフラグが含まれています。フィールドのタイプ(文字列、数値、IPアドレスなど)に応じて、値はバイトストリームに効率的にエンコードされます。たとえば、IPアドレスは4バイトでエンコードされますが、ブールフラグはフィールドヘッダーに直接エンコードされます。このようにして、必要に応じて、SSL証明書もストリームにエンコードできます。通常のバーコード形式では任意のバイト値を転送できないため、次のステップでバイトストリームをエンコードする必要があります。

2.バーコード形式に変換します

結果のバイト配列は、大きな整数として扱われ、ベースエンコーディングと文字セットを使用してターゲットバーコード形式に変換されます(この質問を参照)。このようにして、バーコード形式を効率的に使用してデータを転送します(Base64やその他のエンコーディングとは対照的です)。結果の文字列から、単一のバーコードのチャンクを作成し、それらにいくつかの追加のヘッダー情報を追加できます(たとえば、スキャンする必要のあるバーコードの数?データは暗号化されていますか?...)。

バーコードがモバイルデバイスでスキャンされると、エンコードされた文字列を復元して、同じ大きな整数に変換できます。この整数はバイト配列として扱うことができ、フィールドのシリアル化形式がわかっている場合に解析できます。

このアプローチは非常に効率的で高速であることが判明しました(CFでのBigIntegerの実装に関していくつかの懸念がありました)。

于 2013-09-13T08:11:05.473 に答える
0

一部のバーコード形式には固定文字セットがあり、各文字を保持するために同じ量のスペースを使用して表すことができますが、複数の文字セットを使用するか、各文字を保持するために可変量のスペースを使用するものもあります。たとえば、「クラシック」コード39は43文字を定義し、それぞれが43個の記号の1つで表され、他の文字を表すことはできませんが、別のcode-39バリアントがあり、1つの記号を使用して39個の一般的な文字を表し、他の文字は2文字のシーケンス。たとえば、大量のバイナリデータをcode-39バーコードに保存したいとします。データをbase-64形式に変換した場合、生データの3オクテットに関連付けられた4文字は、平均で約5になる可能性があります。保存する69個のシンボル[base64で使用される64文字のうち約27個は、code39に保存するために2つのシンボルを使用します]。代わりに、それぞれ1つのシンボルで表すことができる32文字を選択した場合、5つのオクテットを使用して24(または25)ビットを格納し、それぞれ5ビットを格納できます[オクテットあたり一貫した1.67シンボルに対して、平均1.89および最悪の場合2.67 ]。「クラシック」コード39(それぞれ1つのシンボルを使用して43文字を表すことができる)を使用している場合、6つのシンボルに4つのオクテットを格納することもできます[オクテットあたり平均1.5シンボル]。

さまざまなバーコード形式が、さまざまな文字セットに対して「最適化」されています。Code 128のようなものは複数の文字セットを持っており、1つの文字セットの全範囲を使用するデータで効率的に使用でき、その外の文字は使用しないでください。特定のシンボル体系の文字セットの使用を最適化するためにデータを再フォーマットするための特定の推奨アプローチはわかりませんが、シンボル体系で使用されるエンコーディングと特定の要件を調べると、どのエンコーディングが最適に機能するかを理解するのに役立ちます。応用。

于 2013-12-05T18:46:03.613 に答える