Hey Guys,
I am using Zxing library to create a QR Code, however to maximize the
amount of data that can be packed into a QR code, I am compressing the
data. The issue that I am running into is that I am able to create a QR
code with the compressed data, however it fails when I try to decompress
it. I am not sure if I am doing something wrong, or if it is simply not
possible with QR codes.
Any assistance will be appreciated, below is my source code.
public class DataExfil {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
DataExfil dataExfil = new DataExfil();
}
public DataExfil() {
String output = "This Repository contains the source code for the
QR Code project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n"
+ "This Repository contains the source code for the QR Code
project.\n";
String path = "code.png";
String doc2;
String charset = "UTF-8";
Map map = new HashMap();
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
try {
encryptQR(output, path, charset, map, 200, 200);
System.out.println("No errors occured...");
System.out.println(decryptQR(path, charset, map));
} catch (WriterException | IOException | NotFoundException |
DataFormatException e) {
// TODO Auto-generated catch block
Logger.getLogger(DataExfil.class.getName()).log(Level.SEVERE,
null, e);
}
}
/**
*
* @param output
* @param file
* @param charset
* @param hintMap
* @param width
* @param height
* @throws WriterException
* @throws IOException
*/
private void encryptQR(String output, String file, String charset,
Map hintMap, int width, int height) throws WriterException,
IOException {
byte[] data;
data = compress(output.getBytes());
BitMatrix mat = new MultiFormatWriter().encode(
new String(data, charset),
BarcodeFormat.QR_CODE, width, height);
MatrixToImageWriter.writeToFile(mat,
file.substring(file.lastIndexOf('.') + 1), new File(file));
}
/**
*
* @param file
* @param charset
* @param map
* @return
* @throws IOException
* @throws NotFoundException
*/
private String decryptQR(String file, String charset, Map map)
throws IOException, NotFoundException, DataFormatException {
BinaryBitmap binBit = new BinaryBitmap(new HybridBinarizer(
new BufferedImageLuminanceSource(ImageIO.read(new
File(file)))));
Result result = new MultiFormatReader().decode(binBit, map);
byte[] data;
data = result.getText().getBytes(charset);
//data = result.getRawBytes();
byte[] decompressed;
decompressed = decompress(data);
String output = new String(decompressed, charset);
return output;
}
/**
*
* @param data
* @return
* @throws IOException
*/
public static byte[] compress(byte[] data) throws IOException {
Deflater deflater = new Deflater();
deflater.setInput(data);
deflater.setLevel(Deflater.BEST_SPEED);
ByteArrayOutputStream outputStream = new
ByteArrayOutputStream(data.length);
deflater.finish();
byte[] buffer = new byte[1024];
while (!deflater.finished()) {
int count = deflater.deflate(buffer); // returns the generated
code... index
outputStream.write(buffer, 0, count);
}
outputStream.close();
byte[] output = outputStream.toByteArray();
System.out.println("Original: " + data.length);
System.out.println("Compressed: " + output.length);
return output;
}
/**
*
* @param data
* @return
* @throws IOException
* @throws DataFormatException
*/
public static byte[] decompress(byte[] data) throws IOException,
DataFormatException {
Inflater inflater = new Inflater();
inflater.setInput(data);
ByteArrayOutputStream outputStream = new
ByteArrayOutputStream(data.length);
byte[] buffer = new byte[1024];
while (!inflater.finished()) {
int count = inflater.inflate(buffer);
outputStream.write(buffer, 0, count);
}
outputStream.close();
byte[] output = outputStream.toByteArray();
System.out.println("Compressed: " + data.length);
System.out.println("decompressed: " + output.length);
return output;
}
}
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/66c656ad-70ce-4252-ab2f-c9d0d82c7181%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.