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)
def encode(self, encoding=None): r"""Encode into a multihash-encoded digest. If `encoding` is `None`, a binary digest is produced: >>> mh = Multihash(0x01, b'TEST') >>> mh.encode() b'\x01\x04TEST' If the name of an `encoding` is specified, it is used to encode the binary digest before returning it (see `CodecReg` for supported codecs). >>> mh.encode('base64') b'AQRURVNU' If the `encoding` is not available, a `KeyError` is raised. """ try: fc = self.func.value except AttributeError: # application-specific function code fc = self.func mhash = fc.to_bytes((fc.bit_length() + 7) // 8, 'big') + bytes([len(self.digest)]) + self.digest if encoding: mhash = CodecReg.get_encoder(encoding)(mhash) return mhash
def encode(self, encoding=None): r"""Encode into a multihash-encoded digest. If `encoding` is `None`, a binary digest is produced: >>> mh = Multihash(0x01, b'TEST') >>> mh.encode() b'\x01\x04TEST' If the name of an `encoding` is specified, it is used to encode the binary digest before returning it (see `CodecReg` for supported codecs). >>> mh.encode('base64') b'AQRURVNU' If the `encoding` is not available, a `KeyError` is raised. """ try: fc = self.func.value except AttributeError: # application-specific function code fc = self.func mhash = bytes([fc, len(self.digest)]) + self.digest if encoding: mhash = CodecReg.get_encoder(encoding)(mhash) return mhash