Rozwijam aplikację dla systemu Android i muszę zakodować i odkodować tablicę bajtów w QRCode wygenerowanym przy pomocy aplikacji ZXing. Mój problem polega na tym, że moja dekodowana wiadomość nie pasuje dokładnie do wygenerowanej tablicy bajtów. że próba utworzenia Qrcode na podstawie tablicy bajtów zawierających wskaźniki inkrementację, tjKodowanie i dekodowanie bajtu [] z ZXingiem
input = [0, 1, 2, ..., 124, 125, 126, 127, -128, -127,... -3, -2, -1, 0, 1, 2, ...]
i po zakodowaniu komunikatu w Qrcode i dekoduje go z boku reagujących, to otrzymuje się następujące dane wyjściowe tablicy bajt:
output = [0, 1, 2, ..., 124, 125, 126, 127, 63, 63,... 63, 63, 63, 0, 1, 2, ...]
Wszystkie wartości "ujemnego" bajtu są zamieniane na znak ASCII 63: "?" znaki zapytania. Zakładam, że coś jest nie tak z kodowaniem kodu, ale ponieważ używam ISO-8859-1, który wszyscy uważają za rozwiązanie tego rodzaju problemu (other topic treating the same kind of issue lub here), nie widzę, gdzie jest mój błąd lub jeśli pomijam krok podczas wprowadzania kodowania lub dekodowania. Oto kod, który wykona kodować daną tablicę bajtów:
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();
I zdekodować QRCode, wyślę następujące 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);
}
I czekać na wynik:
@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
}
}
}
Czy możesz mi powiedzieć, gdzie są moje błędy lub gdzie powinienem patrzeć?
Dziękuję dużo,
Franck
Po prostu "baw się" (nie mam pojęcia o tym), co się stanie, jeśli użyjesz kodowania UTF-8 na przykład? – Ixx
UTF-8 na pewno nie zadziała. Nie każda sekwencja bajtów jest prawidłową sekwencją UTF-8, aby rozpocząć. Tak więc nie jest możliwe uzyskanie ciągu z większości wejść w ten sposób. –