使用ZXing对byte 进行编码和解码

我正在开发一个Android应用程序,我需要编码和解码ZXing应用程序生成的QRCode中的字节数组。 我的问题是,我的消息解码不完全匹配生成的字节数组。 我试图创build一个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,所有人都声称自己是这类问题的解决scheme( 其他主题在 这里 处理同样types的问题 )看看我的错误在哪里,或者如果我在编码或解码实例期间跳过了一步。 这里是我执行的编码给定的字节数组的代码:

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

你能告诉我我的错误在哪里,或者我应该在哪里看?

万分感谢,

弗兰克

Solutions Collecting From Web of "使用ZXing对byte 进行编码和解码"

你犯了错误的想法,你可以把任意的二进制数据转换成有效的string,而不使用某种铠装。 它不起作用。 二进制 – >文本 – >二进制是有损使用任何标准字符集/编码。 (提示:使用UTF-8也不行。)

你应该使用像base64编码或hex编码的东西,以确保二进制数据不会被损坏。

在我的一个应用程序中,我需要对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是使原始问题的代码失败的一点。 我花了相当长的一段时间来挖掘这一点,因为我没有看到这个地方显而易见的地方,拉丁语1编码是Xzing中QR码的标准编码。 尤其棘手的是Xzing在线解码器http://zxing.org/w/decode.jspx并没有设置CHARACTER_SET,所以当在这个站点上解码时,生成的QR码看起来有问题&#x3002;

从概念上讲,QR码对文本进行编码,而不是字节。 当然,它们将input转换为一系列字节,虽然这对调用者来说是不透明的。 你说得对,如果select正确的编码,就可以让你偷偷地读取字节,ISO-8859-1在这里是正确的select。 它确实有效。

ASCII是不可能的,因为它没有定义> = 128的字符,UTF-8绝对不会工作

这里的问题可能是你的代码。 我不确定你在这里尝试了什么……看起来你正在设置一个Intent (到Barcode Scanner?),但是你不知道,你只是在制作一个Intent并发送给从项目中复制的一些代码? 我想象一下如何设置额外的Intent

如果您在应用程序中执行此操作,这应该会更简单。 只需直接重用QRCodeEncoder.encodeAsBitmap()并删除其余部分。