def encode_int(value: int, alphabet: str) -> str:
  if value < 0:
    raise ValueError("cannot encode negative integers")
  if value == 0:
    return alphabet[0]

  base = len(alphabet)
  out = []
  while value:
    value, digit = divmod(value, base)
    out.append(alphabet[digit])
  return "".join(reversed(out))

def decode_int(text: str, alphabet: str) -> int:
  index = {char: i for i, char in enumerate(alphabet)}
  value = 0
  base = len(alphabet)
  for char in text:
    if char not in index:
      raise ValueError(f"invalid character for alphabet: {char!r}")
    value = value * base + index[char]
  return value

def bytes_to_int(data: bytes) -> int:
  return int.from_bytes(data, "big") if data else 0

def int_to_bytes(value: int, length: int) -> bytes:
  return value.to_bytes(length, "big") if length else b""
