In Briar, we use ISO 8859-1 to encode bytes directly as a string. We could do the same here. The hidden service address and the single-use auth token should have the same length, so we could just concatenate them. Maybe we'd need to add some sort of prefix and/or a version byte as well to be able to change the format in the future.
I also thought about whether we should split the first byte into n bits for a protocol ID and 8-n bits for the protocol version, so that we could distinguish mailbox pairing QR codes from BQP QR codes (and any other QR codes we might add in the future). (Protocol ID 0 would need to be assigned to BQP, as the initial bits are currently zero in BQP QR codes.) This would allow us to show a helpful message like "The QR code you scanned is meant for adding contacts, not for pairing a mailbox" (or vice versa).
But we'd still need to show a generic "This QR code is not valid" message if the protocol ID wasn't recognised, so I think the extra complexity of including a protocol ID probably isn't justified. I'm still in favour of a version byte though, so we can migrate to new formats.