| import binascii |
| import shlex |
| import subprocess |
| |
| def get_command_output(command): |
| try: |
| return subprocess.check_output( |
| command, |
| shell=True, |
| universal_newlines=True).rstrip() |
| except subprocess.CalledProcessError as e: |
| return e.output |
| |
| def bitcast_to_string(b: bytes) -> str: |
| """ |
| Take a bytes object and return a string. The returned string contains the |
| exact same bytes as the input object. (latin1 <-> unicode transformation is |
| an identity operation for the first 256 code points). |
| """ |
| return b.decode("latin1") |
| |
| def bitcast_to_bytes(s: str) -> bytes: |
| """ |
| Take a string and return a bytes object. The returned object contains the |
| exact same bytes as the input string. (latin1 <-> unicode transformation isi |
| an identity operation for the first 256 code points). |
| """ |
| return s.encode("latin1") |
| |
| def unhexlify(hexstr): |
| """Hex-decode a string. The result is always a string.""" |
| return bitcast_to_string(binascii.unhexlify(hexstr)) |
| |
| def hexlify(data): |
| """Hex-encode string data. The result if always a string.""" |
| return bitcast_to_string(binascii.hexlify(bitcast_to_bytes(data))) |
| |
| # TODO: Replace this with `shlex.join` when minimum Python version is >= 3.8 |
| def join_for_shell(split_command): |
| return " ".join([shlex.quote(part) for part in split_command]) |