web-dev-qa-db-ja.com

GUIDを格納するための最も効率的なバーコード

現在作業中のシステムで、ユーザーがシステムにログインする必要があり、クライアントはバーコードスキャナーとカードを使用して価格を抑えたいと考えています。 (はい、ユーザー名とパスワードの方が安いですが、彼女はカードタイプのソリューションを望んでいるので、それを手に入れます。)

すべてのデータはGUIDをキーフィールドとして使用しているので、GUIDをカードのバーコードに直接保存したいと思います。9の3としてコーディングするのは簡単ですが、スペースを最も効率的に使用します。

GUIDをバーコードに保存するためのベストプラクティスまたは最も効率的な方法はありますか?一貫した長さとデータの深さがあるので、標準があると思いましたが、それを見つけることができません。私自身を生成するのに十分簡単でしょう-どちらかの端のcharを制御し、次にその間のバイナリデータを制御しますが、標準の読者が解釈する方法を知っているものが必要です。

ありがたいことにどんな助けも受けました。

19
Matthew Baker

Code39やCode128などの汎用リニアバーコードを使用した特殊用途のデータ圧縮に関するオープンスタンダードはありません。ほとんどのISO/IEC標準の2Dバーコードは、Extended Channel Interpretation(ECI)と呼ばれる特殊用途のデータエンコーディングメカニズムをサポートしています。データが特定のアプリケーション標準またはエンコード方式、たとえばIPv4アドレス圧縮用のECI298765に準拠していることを指定する [*]。残念ながら、GUID圧縮は登録されているものの中にはありません。それでも、リーダーのサポートが不足しているため、アプリケーション内でこれを処理する必要があります。

そのため、GUIDを、ユビキタスなバーコードシンボルで効率的に処理できる形式に事前エンコード(およびその後デコード)する必要があります。

GUIDを格納する効率的な方法は、40桁に変換することです。[†] 小数表現で、倍密度数値圧縮(「モードC」)を使用して結果をCode128バーコードに保存します。

たとえば、GUIDについて考えてみます。

cd171f7c-560d-4a62-8d65-16b87419a58c

16進数で表されます:

0xCD171F7C560D4A628D6516B87419A58C

10進数の40桁に変換:

0272611800569275698104677545117639878028

Code128バーコード内にエンコード [‡]

GUID encoded in decimal within a Code 128

もちろん、アプリケーションはこの入力を10進数でエンコードされたGUIDとして認識し、上記のプロセスを逆にする必要がありますが、データを変換する必要のない、はるかに効率的なアプローチが存在するかどうかは疑問です。異常な基数に変換してから、スキャン時にASCII制御文字を処理する複雑さを処理します。

[*]割り当てられたECIコードのレジスタは、AIM store as "ECI Part 3:Register" から無料で入手できます。

[†] GUIDの範囲全体を39桁以内に格納することは可能ですが、39桁のモードCコード128シンボルは実際には40桁のシンボルよりも長くなります。

25
Terry Burton