def string(self): token = self._consume(1) if token < "\x05": return "" elif "\x05" <= token <= "\xF5": return tok2str(ord(token)) elif token == "\xFA": user = self.string() server = self.string() return user + "@" + server elif token == "\xFC": return self._consume(self.int8()) elif token == "\xFD": return self._consume(self.int24()) elif token == "\xFE": return tok2str(0xF5 + self.int8()) else: raise Exception("Unknown string token '%02x'" % ord(token))
def string(self): token = self.int8() if token == 0x00: return "" elif 0x02 < token < 0xf5: if token == 0xec: return tok2str(0xed + self.int8()) else: return tok2str(token) elif token == 0xFA: user = self.string() server = self.string() return user + "@" + server elif token == 0xFC: return self._consume(self.int8()) elif token == 0xFD: return self._consume(self.int24()) elif token == 0xFE: return tok2str(0xF5 + self.int8()) elif token == 0xFF: nibble = self.int8() ignore_last_nibble = nibble & 0x80 size = nibble & 0x7f nibbles_count = size * 2 - (1 if ignore_last_nibble else 0) data = self._consume(size) output = "" for i in xrange(nibbles_count): shift = 4 * (1 - i % 2) decimal = (ord(data[i // 2]) & (15 << shift)) >> shift if decimal < 10: output += str(decimal) else: output += chr(decimal - 10 + 45) return output else: raise ValueError("Unknown string token: %02x" % ord(token))