1061da546Spatrickimport binascii
2*f6aab3d8Srobertimport shlex
3061da546Spatrickimport subprocess
4061da546Spatrick
5061da546Spatrickdef get_command_output(command):
6*f6aab3d8Srobert    try:
7*f6aab3d8Srobert        return subprocess.check_output(
8*f6aab3d8Srobert            command,
9*f6aab3d8Srobert            shell=True,
10*f6aab3d8Srobert            universal_newlines=True).rstrip()
11*f6aab3d8Srobert    except subprocess.CalledProcessError as e:
12*f6aab3d8Srobert        return e.output
13061da546Spatrick
14*f6aab3d8Srobertdef bitcast_to_string(b: bytes) -> str:
15*f6aab3d8Srobert    """
16*f6aab3d8Srobert    Take a bytes object and return a string. The returned string contains the
17*f6aab3d8Srobert    exact same bytes as the input object. (latin1 <-> unicode transformation is
18*f6aab3d8Srobert    an identity operation for the first 256 code points).
19*f6aab3d8Srobert    """
20*f6aab3d8Srobert    return b.decode("latin1")
21061da546Spatrick
22*f6aab3d8Srobertdef bitcast_to_bytes(s: str) -> bytes:
23061da546Spatrick    """
24*f6aab3d8Srobert    Take a string and return a bytes object. The returned object contains the
25*f6aab3d8Srobert    exact same bytes as the input string. (latin1 <-> unicode transformation isi
26*f6aab3d8Srobert    an identity operation for the first 256 code points).
27061da546Spatrick    """
28*f6aab3d8Srobert    return s.encode("latin1")
29061da546Spatrick
30061da546Spatrickdef unhexlify(hexstr):
31061da546Spatrick    """Hex-decode a string. The result is always a string."""
32061da546Spatrick    return bitcast_to_string(binascii.unhexlify(hexstr))
33061da546Spatrick
34061da546Spatrickdef hexlify(data):
35061da546Spatrick    """Hex-encode string data. The result if always a string."""
36061da546Spatrick    return bitcast_to_string(binascii.hexlify(bitcast_to_bytes(data)))
37*f6aab3d8Srobert
38*f6aab3d8Srobert# TODO: Replace this with `shlex.join` when minimum Python version is >= 3.8
39*f6aab3d8Srobertdef join_for_shell(split_command):
40*f6aab3d8Srobert    return " ".join([shlex.quote(part) for part in split_command])
41