title: QR Code encoding and decoding using zxing
body: <p>Okay, so I'm going to take the off chance that someone here has used zxing before. I'm developing a Java application, and one of the things it needs to do is encode a byte array of data into a QR Code and then decode it at a later time.  </p>
  
  <p>Here's an example of what my encoder looks like:</p>
  
  <pre><code>byte[] b = {0x48, 0x45, 0x4C, 0x4C, 0x4F};
  //convert the byte array into a UTF-8 string
  String data;
  try {
      data = new String(b, "UTF8");
  }
  catch (UnsupportedEncodingException e) {
   //the program shouldn't be able to get here
   return;
  }
  
  //get a byte matrix for the data
  ByteMatrix matrix;
  com.google.zxing.Writer writer = new QRCodeWriter();
  try {
   matrix = writer.encode(data, com.google.zxing.BarcodeFormat.QR_CODE, width, height);
  }
  catch (com.google.zxing.WriterException e) {
   //exit the method
   return;
  }
  
  //generate an image from the byte matrix
  int width = matrix.getWidth(); 
  int height = matrix.getHeight(); 
  
  byte[][] array = matrix.getArray();
  
  //create buffered image to draw to
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  
  //iterate through the matrix and draw the pixels to the image
  for (int y = 0; y &lt; height; y++) { 
   for (int x = 0; x &lt; width; x++) { 
    int grayValue = array[y][x] &amp; 0xff; 
    image.setRGB(x, y, (grayValue == 0 ? 0 : 0xFFFFFF));
   }
  }
  
  //write the image to the output stream
  ImageIO.write(image, "png", outputStream);
  </code></pre>
  
  <p>The beginning byte array in this code is just used to test it. The actual byte data will be varied.</p>
  
  <p>Here's what my decoder looks like:</p>
  
  <pre><code>//get the data from the input stream
  BufferedImage image = ImageIO.read(inputStream);
  
  //convert the image to a binary bitmap source
  LuminanceSource source = new BufferedImageLuminanceSource(image);
  BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
  
  //decode the barcode
  QRCodeReader reader = new QRCodeReader();
  
  Result result;
  try {
   result = reader.decode(bitmap, hints);
  } catch (ReaderException e) {
   //the data is improperly formatted
   throw new MCCDatabaseMismatchException();
  }
  
  byte[] b = result.getRawBytes();
  System.out.println(ByteHelper.convertUnsignedBytesToHexString(result.getText().getBytes("UTF8")));
  System.out.println(ByteHelper.convertUnsignedBytesToHexString(b));
  </code></pre>
  
  <p><code>convertUnsignedBytesToHexString(byte)</code> is a method which converts an array of bytes in a string of hexadecimal characters.</p>
  
  <p>When I try to run these two blocks of code together, this is the output:</p>
  
  <pre><code>48454c4c4f
  202b0b78cc00ec11ec11ec11ec11ec11ec11ec
  </code></pre>
  
  <p>Clearly the text is being encoded, but the actual bytes of data are completely off. Any help would be appreciated here.</p>