def decode(mhash, encoding=None): r"""Decode a multihash-encoded digest into a `Multihash`. If `encoding` is `None`, a binary digest is assumed. >>> mhash = b'\x11\x0a\x0b\xee\xc7\xb5\xea?\x0f\xdb\xc9]' >>> mh = decode(mhash) >>> mh == (Func.sha1, mhash[2:]) True If the name of an `encoding` is specified, it is used to decode the digest before parsing it (see `CodecReg` for supported codecs). >>> import base64 >>> emhash = base64.b64encode(mhash) >>> emh = decode(emhash, 'base64') >>> emh == mh True If the `encoding` is not available, a `KeyError` is raised. If the digest has an invalid format or contains invalid data, a `ValueError` is raised. """ mhash = bytes(mhash) if encoding: mhash = CodecReg.get_decoder(encoding)(mhash) try: func = mhash[0] length = mhash[1] digest = mhash[2:] except IndexError as ie: raise ValueError("multihash is too short") from ie if length != len(digest): raise ValueError( "multihash length field does not match digest field length") return Multihash(func, digest)