【发布时间】:2012-06-19 12:43:15
【问题描述】:
我正在开发一个 Android 应用程序,我需要在使用 ZXing 应用程序生成的 QRCode 中对字节数组进行编码和解码。我的问题是我解码的消息与生成的字节数组不完全匹配。 我试图创建一个基于包含递增索引的字节数组的二维码,即
input = [0, 1, 2, ..., 124, 125, 126, 127, -128, -127,... -3, -2, -1, 0, 1, 2, ...]
在二维码中对消息进行编码并在响应端解码后,我得到以下字节数组输出:
output = [0, 1, 2, ..., 124, 125, 126, 127, 63, 63,... 63, 63, 63, 0, 1, 2, ...]
所有“负”字节值都转换为 ASCII 字符 63:'?'问号字符。 我认为编码字符集出了点问题,但由于我使用的是 ISO-8859-1,每个人都声称这是此类问题的解决方案(other topic treating the same kind of issue 或 here),我看不出在哪里是我的错误,或者如果我在编码或解码的实例化过程中跳过了一个步骤。 这是我为给定字节数组编码而执行的代码:
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,我发送以下 Intent
@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
}
}
}
你能告诉我我的错误在哪里,或者我应该看看哪里?
非常感谢,
弗兰克
【问题讨论】:
-
只是为了“玩”(我对此一无所知)如果您使用 UTF-8 作为编码会发生什么?
-
UTF-8 肯定行不通。首先,并非每个字节序列都是有效的 UTF-8 序列。因此,甚至不可能以这种方式从大多数输入中获取字符串。
标签: java android character-encoding zxing iso-8859-1