Esempio n. 1
0
 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')
Esempio n. 2
0
 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
Esempio n. 3
0
 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
Esempio n. 4
0
    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
Esempio n. 5
0
    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'")
Esempio n. 6
0
    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))