def _decode_kanji_message(self): char_count = self.scanner.read_int( bits_for_length(self.version, MODE_KANJI)) nums = [] for _ in range(char_count): mashed = self.scanner.read_int(13) num = ((mashed // 0xC0) << 8) + mashed % 0xC0 num += 0x8140 if num < 0x1F00 else 0xC140 nums.extend(divmod(num, 2**8)) return ints_to_bytes(nums).decode('shift-jis')
def _decode_alpha_num_message(self): char_count = self.scanner.read_int( bits_for_length(self.version, MODE_ALPHA_NUM)) val = '' doubles, has_single = divmod(char_count, 2) for _ in range(doubles): double = self.scanner.read_int(11) val += ALPHANUM_CHARS[double // 45] + ALPHANUM_CHARS[double % 45] if has_single: val += ALPHANUM_CHARS[self.scanner.read_int(6)] return val
def _decode_bytes_message(self): char_count = self.scanner.read_int( bits_for_length(self.version, MODE_BYTES)) raw = ints_to_bytes( self.scanner.read_int(8) for _ in range(char_count)) try: val = raw.decode('utf-8') except UnicodeDecodeError: val = raw.decode('iso-8859-1') if val.startswith('BEGIN:VCARD\n'): return vCard.from_text(val) return val
def _decode_numeric_message(self): char_count = self.scanner.read_int( bits_for_length(self.version, MODE_NUMBER)) val = 0 triples, rest = divmod(char_count, 3) for _ in range(triples): val = val * 1000 + self.scanner.read_int(10) if rest == 2: val = val * 100 + self.scanner.read_int(7) elif rest == 1: val = val * 10 + self.scanner.read_int(4) return val
def test_illegal_char_counts(self): # illegal version self.assertRaises(IllegalQrVersionError, lambda: bits_for_length(0, 1)) self.assertRaises(IllegalQrVersionError, lambda: bits_for_length(41, 1)) self.assertRaises(IllegalQrVersionError, lambda: bits_for_length(8.5, 1)) # illegal modes self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, 0), 'Unknown data type ID: 0') self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, -1), 'Unknown data type ID: -1') self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, 3), 'Unknown data type ID: 3') self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, 7), 'Unknown data type ID: 7') self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, 9), 'Unknown data type ID: 9') # downright weird modes self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, 3.5), 'Unknown data type ID: 3.5') self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, None), 'Unknown data type ID: None') self.assertRaisesMsg(QrFormatError, lambda: bits_for_length(8, 'hi'), "Unknown data type ID: 'hi'")
def test_char_counts(self): self.assertEqual(8, bits_for_length(8, MODE_KANJI)) self.assertEqual(9, bits_for_length(8, MODE_ALPHA_NUM)) self.assertEqual(10, bits_for_length(8, MODE_NUMBER)) self.assertEqual(10, bits_for_length(18, MODE_KANJI)) self.assertEqual(11, bits_for_length(18, MODE_ALPHA_NUM)) self.assertEqual(12, bits_for_length(18, MODE_NUMBER)) self.assertEqual(12, bits_for_length(28, MODE_KANJI)) self.assertEqual(13, bits_for_length(28, MODE_ALPHA_NUM)) self.assertEqual(14, bits_for_length(28, MODE_NUMBER)) self.assertEqual(8, bits_for_length(8, MODE_BYTES)) self.assertEqual(16, bits_for_length(18, MODE_BYTES)) self.assertEqual(16, bits_for_length(28, MODE_BYTES))