docstr: Performs Octal decoding
docstr_tok: ["Performs","Octal","decoding"]
code: def decode(self, ctext: T) -> Optional[U]:
      """
      Performs Octal decoding
      """
      str_converted = []
      octal_seq = ctext.split(" ")
      if len(octal_seq) == 1:
          # Concatted octal must be formed of octal triplets
          if len(ctext) % 3 != 0:
              return None
          octal_seq = [
              ctext[i : i + 3] for i in range(0, len(ctext), 3)
          ]
          logging.debug(f"Trying chunked octal {octal_seq}")
      try:
          for octal_char in octal_seq:
              if len(octal_char) > 3:
                  logging.debug("Octal subseq too long")
                  return None
              n = int(octal_char, 8)
              if (
                  n < 0
              ):  # n cannot be greater than 255, as we checked that with the earlier length check
                  logging.debug(f"Non octal char {octal_char}")
                  return None
              str_converted.append(n)
  
          return bytes(str_converted)
      # Catch bad octal chars
      except ValueError:
          return None
  
file_path: Ciphey/ciphey/basemods/Decoders/octal.py
imports: from typing import Dict, Optional
  import logging
  from rich.logging import RichHandler
  from ciphey.iface import Config, Decoder, ParamSpec, T, U, registry
label_desc: Use image node_id 1 for calling the Octal obj's underlying member method code with example usage: obj.decode(ctext) and returns: bytes, None, None, None, None