gpt4 book ai didi

java - 使用 ZXing 编码和解码 byte[]

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:51:18 26 4
gpt4 key购买 nike

我正在开发一个 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,每个人都声称它是此类问题的解决方案(other topic treating the same kind of issuehere),我看不到哪里是我的错误,或者如果我在编码或解码的实例化过程中跳过了一个步骤。下面是我为给定字节数组编码而执行的代码:

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

}

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

非常感谢,

弗兰克

最佳答案

在我的一个应用程序中,我需要对使用 ZXing 应用程序生成的 QRCode 中的字节数组进行编码和解码。由于字节数组包含压缩文本数据,我想避免使用 base64 编码。这样做是可能的,但由于到目前为止我还没有看到完整的代码 fragment 集,我将在此处发布它们。

编码:

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");
...
}

我认为没有在启动扫描的 Intent 数据中将 CHARACTER_SET 设置为 ISO-8859-1 是导致原始问题代码失败的关键。我花了很长时间才把它弄清楚,因为我还没有在任何地方清楚地看到它,而且 Latin 1 编码是 Xzing 中 QR 码的标准编码。特别棘手的是 Xzing 在线解码器 http://zxing.org/w/decode.jspx也没有设置 CHARACTER_SET,因此生成的 QR 码在该站点上解码时看起来有问题。

关于java - 使用 ZXing 编码和解码 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com