次の行を使用して DataMatrix コードを取得します。
BitMatrix bitMatrix = new DataMatrixWriter().encode(dmie.preEncodeBarcode(dataToEncode), BarcodeFormat.DATA_MATRIX, 50, 50, null);
取得した入力文字列には、動的フィールドの終わりを示す「FNC1」(文字列内のプレーン文字と同様) が含まれており、合計で文字列には 4 つの異なる GS1 DataMatrix アプリケーション識別子とそれぞれの値が含まれています。
preEncodeBarcode() が行うことは<GS>
、次のように "FNC1" を に置き換えることです。
input = input.replaceAll("FNC1", new String(new byte[] {0x1d}));
それ以外の場合は、DataMatrix でエンコードされた "FNC1910005FNC1230202[...]" を取得するだけですが、もちろん<GS>
テキスト "FNC1" の代わりに必要です。
ただし、FNC1 を<GS>
(「\u001c」も使用してみました) に置き換えると、通常のコードではなく、この非常に奇妙な二重 DM コードが表示されます。
「FNC1」の置き換えをスキップした場合にのみ<GS>
、適切なものが得られます。
<GS>
を含む文字列に基づいて適切な DataMatrix コードを取得する方法はありますか? <GS>
それとも、文字列を直接持っているだけで何か間違ったことをしていますか? その場合、zxing で正しい DataMatrix を取得するにはどうすればよいですか? 私はずっと読んでいますが、これについて頭を包むことはできません。
更新: よくわかりませんが、ここで奇妙な種類のバグが発生している可能性があります。これは、入力文字列を前処理した後に DataMatrixWriter に送信するものです (スペースは ):
[d29100001 21000000049347037 24000163718 390300000002990
私がかなりあいまいだと思うのは、(執筆時点で)送信した場合、input.substring(2, input.length());
またはinput.substring(0, input.length()-3);
それが正常に機能するのに対し、代わりに最初から1文字(またはそれ以下)または最後から2文字以下を削除すると、これが得られることです奇妙なデータマトリックス。さらに奇妙なのは、この動作が一貫していないことです。最後に 6 つの乱数を追加すると問題なく動作しますが、それらの数字のうち 3 つを削除すると、再び問題が発生します。そして最悪なことに、1 時間前は を送信できませんでしたinput.substring(0, input.length()-3)
が、今では送信できます。
言い換えれば、私は完全に困惑しています。
(PS.ここにあるコードを使用して DataMatrix を必要なサイズにスケーリングしていますが、最初から間違った出力を与えるのは zxing です。)