Распаковка байтового массива в Java - PullRequest
0 голосов
/ 30 марта 2019

При распаковке данных примера кода adhaar qr выполните следующие шаги: https://uidai.gov.in/images/resource/User_manulal_QR_Code_15032019.pdf, Я получил java.util.zip.DataFormatException: incorrect header check error while decompressing the byte array

// getting aadhaar sample qr code data from

// https://uidai.gov.in/images/resource/User_manulal_QR_Code_15032019.pdf

String s ="taking  here Aadhaar sample qr code data";
BigInteger bi = new BigInteger(s, 10); 

byte[] array = bi.toByteArray();    
Inflater decompresser = new Inflater(true);
decompresser.setInput(array);
ByteArrayOutputStream outputStream = new 
ByteArrayOutputStream(array.length);
byte[] buffer = new byte[1024];  
while (!decompresser.finished()) {  
    int count = decompresser.inflate(buffer);  
    outputStream.write(buffer, 0, count);  
}  
outputStream.close();  
byte[] output = outputStream.toByteArray(); 
String st = new String(output, 0, 255, "ISO-8859-1");
System.out.println("==========="+st);

1 Ответ

1 голос
/ 16 апреля 2019

Проблема в том, что вы используете класс Java Inflater, который использует алгоритм сжатия Zlib. Однако в безопасном QR-коде UIDAI используется алгоритм сжатия GZip. Таким образом, логика декомпрессии должна быть изменена следующим образом: ByteArrayOutputStream os = new ByteArrayOutputStream(); try { ByteArrayInputStream in = new Byte введите код здесь ArrayInputStream(data); GZIPInputStream gis = new GZIPInputStream(in); byte[] buffer = new byte[1024]; int len; while((len = gis.read(buffer)) != -1){ os.write(buffer, 0, len); } os.close(); gis.close(); } catch (IOException e) { e.printStackTrace(); return null; } byte[] output = os.toByteArray(); ;

...