9

Androidアプリを開発していますが、ZXingアプリで生成されたQRCodeでバイト配列をエンコードおよびデコードする必要があります。私の問題は、デコードされたメッセージが生成されたバイト配列と正確に一致しないことです。増分インデックスを含むバイト配列に基づいてQRCodeを作成しようとしました。

input = [0, 1, 2, ..., 124, 125, 126, 127, -128, -127,... -3, -2, -1, 0, 1, 2, ...]

そして、QRCodeでメッセージをエンコードし、レスポンダー側でデコードした後、次のバイト配列出力を取得します。

output = [0, 1, 2, ..., 124, 125, 126, 127, 63, 63,... 63, 63, 63, 0, 1, 2, ...]

すべての「負の」バイト値はASCII文字63に変換されます:'?' 疑問符の文字。エンコーディング文字セットに問題があると思いますが、私はISO-8859-1を使用しているので、誰もがそのような種類の問題(同じ種類の問題を扱う他のトピックまたはここ)の解決策であると主張しています。私の間違いがどこにあるか、またはエンコードまたはデコードのインスタンス化中にステップをスキップしているかどうかを確認します。特定のバイト配列をエンコードするために実行するコードは次のとおりです。

String text = "";
byte[] res = new byte[272];
for (int i = 0; i < res.length; i++) {
    res[i] = (byte) (i%256);
}
try {
    text = new String(res, "ISO8859_1");
} catch (UnsupportedEncodingException e) {
    // TODO
}
Intent intent = new Intent(Intents.Encode.ACTION);
Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
intent.putExtra(Intents.Encode.FORMAT, "ISO8859_1");
intent.putExtra(Intents.Encode.DATA, text);
intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());

boolean useVCard = intent.getBooleanExtra(USE_VCARD_KEY, false);
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(activity, intent, dimension, useVCard);
Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();

そして、QRCodeをデコードするために、私は次のインテントを送信します

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.qrcodeDecoding);

    Intent intent = new Intent(Intents.Scan.ACTION);
    intent.putExtra(Intents.Scan.MODE, Intents.Scan.QR_CODE_MODE);
    startActivityForResult(intent, 0);
}

そして結果を待ちます:

@Override
protected void onActivityResult(int request, int result, Intent data)
{
    if(request == 0)
    {
        //action
        if(result == RESULT_OK)
        {
            String res = data.getStringExtra(Intents.Scan.RESULT);
            byte[] dat = null;

            try{
                    dat = res.getBytes("ISO8859_1");
            } catch(UnsopportedEncodingException e) {
                    //TODO
            }
        }
        else if(result == RESULT_CANCELED)
        {
            //TODO
        }
    }

}

私の間違いはどこにあるのか、どこを見ればいいのか教えてください。

大いに感謝する、

フランク

4

3 に答える 3

5

私のアプリの1つでは、ZXingアプリで生成されたQRCodeでバイト配列をエンコードおよびデコードする必要がありました。バイト配列には圧縮されたテキストデータが含まれていたため、base64エンコーディングを避けたかったのです。これを行うことは可能ですが、これまでコードスニペットの完全なセットを見たことがないので、ここに投稿します。

エンコーディング:

public void showQRCode(Activity activity, byte[] data){
  Intent intent = new Intent("com.google.zxing.client.android.ENCODE");
  intent.putExtra("ENCODE_TYPE", "TEXT_TYPE");
  intent.putExtra("ENCODE_SHOW_CONTENTS", false);
  intent.putExtra("ENCODE_DATA", new String(data, "ISO-8859-1"));
  activity.startActivity(intent);
}

スキャンを開始します。

public static void startQRCodeScan(Activity activity){
  Intent intent = new Intent(com.google.zxing.client.android.SCAN);
  intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
  intent.putExtra("CHARACTER_SET", "ISO-8859-1");
  activity.startActivityForResult(intent, 0);
}

スキャン結果ハンドラー:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
  byte[] result = intent.getStringExtra("SCAN_RESULT").getBytes("ISO-8859-1");
  ...
}

スキャンを開始するためのインテントデータでCHARACTER_SETをISO-8859-1に設定しないことが、元の質問のコードを失敗させたポイントだと思います。これがどこにもはっきりと投稿されているのを見たことがなく、Latin 1エンコーディングがXzingのQRコードの標準エンコーディングであるため、これを掘り下げるのにかなりの時間がかかりました。特に注意が必要なのは、Xzingオンラインデコーダーhttp://zxing.org/w/decode.jspxがCHARACTER_SETも設定しないため、このサイトでデコードしたときに生成されたQRコードに問題があるように見えることです。

于 2013-10-22T20:28:56.043 に答える
2

なんらかの装甲を使わなくても、任意のバイナリデータを有効な文字列に変換できると誤解しています。動作しません。バイナリ->テキスト->バイナリは、標準の文字セット/エンコーディングのいずれかを使用すると不可逆です。(ヒント:UTF-8の使用も機能しません。)

バイナリデータが破損しないようにするには、base64エンコーディングや16進エンコーディングなどを使用する必要があります。

于 2012-06-17T01:54:59.970 に答える
1

概念的には、QRコードはバイトではなくテキストをエンコードします。もちろん、それらは入力を一連のバイトに変換しますが、それは呼び出し元には不透明です。たまたま、正しいエンコーディングを選択すると、バイトをこっそりと通過させることができます。ここでは、ISO-8859-1が正しい選択です。実際には機能します。

ASCIIは、128以上の文字を定義していないため不可能であり、UTF-8は確実に機能しません。

ここでの問題はおそらくあなたのコードです。ここで何をしようとしているのかわかりません...どこかに(バーコードスキャナーに?)送信するように設定しているようですIntentが、そうではありません。作成しIntentてコードに送信しているだけです。プロジェクトからコピーしましたか?にエクストラを設定する方法に問題があると思いますIntent

アプリ内で実行している場合、これははるかに簡単なはずです。直接再利用QRCodeEncoder.encodeAsBitmap()して、残りを削除してください。

于 2012-06-17T10:26:18.900 に答える