This Python module provides functionality to encode arbitrary binary data into a series of QR codes and decode them back into the original data. It uses the qrcode
library for encoding and the zxing
and qrtools
libraries for decoding.
Pubished at https://pypi.org/project/qrare/
pip install qrare
git clone https://github.com/tcsenpai/qrare/
cd qrare
- Python 3.x
- qrcode
- qrtools
- compress
- Pillow (PIL)
- zxing
Install the required libraries using pip:
pip install qrcode pillow zxing qrtools compress
Or install the dependencies using:
pip install -r requirements.txt
Encodes binary data into a series of QR code images.
Parameters:
data
(bytes): The binary data to encode.chunk_size
(int, optional): The maximum number of hexadecimal characters per QR code. Default is 100.filename_prefix
(str, optional): The prefix for the generated QR code image filenames. Default is "qr_code".
This function performs the following steps:
- Compresses the binary data using gzip.
- Converts the binary data to a hexadecimal string.
- Splits the hex string into chunks of the specified size.
- Creates a QR code for each chunk, including chunk number and total chunk count.
- Saves each QR code as a PNG image.
Decodes a series of QR code images back into the original binary data.
Parameters:
filename_prefix
(str, optional): The prefix of the QR code image filenames to decode. Default is "qr_code".
Returns:
bytes
: The decoded binary data, orNone
if no QR codes were found.
This function performs the following steps:
- Iterates through numbered QR code images with the given prefix.
- Decodes each QR code using the zxing library, falling back to qrtools if zxing cannot decode a qrcode.
- Extracts chunk information and data from each decoded QR code.
- Reconstructs the original hexadecimal string from the chunks.
- Converts the hexadecimal string back to binary data.
- Decompresses the binary data using gzip.
- Returns the decompressed binary data.
# Encode binary data into QR codes
import qrare
original_data = b"This is a binary string \x00\x01\x02 with some non-printable characters.
qrare.bin_to_qr(original_data, chunk_size=50)
And vice versa
# Decode QR codes back into binary data
import qrare
decoded_data = qrare.qr_to_bin()
print("Decoded data:", decoded_data)
print("Original and decoded data match:", original_data == decoded_data)
- The script automatically determines the appropriate QR code version based on the data size.
- Data is compressed using gzip before being encoded into QR codes to maximize data capacity.
- Data is then decompressed using gzip after being decoded from QR codes.
- Error correction level is set to LOW (L) to maximize data capacity.
- The script handles binary data, including non-printable characters.
- THe script has a fallback method that (until now) allows for a 100% error free decoding.
- QR code images are saved and read from the current working directory.
- Ensure you have write permissions in the directory where the script is run.
- The script includes basic error handling for file not found and decoding errors.
- If an error occurs during decoding, it will be printed to the console.
- The maximum data capacity depends on the QR code version and error correction level.
- Very large binary files may require a large number of QR codes.
- The script assumes that QR codes will be scanned in the correct order for decoding.