|
|
- import argparse
-
-
- def convert_to(dec_str: str) -> None:
- str_parts = dec_str.split(".")
- assert len(str_parts) == 2
-
- whole_str, part_str = str_parts
- whole_dec = int(whole_str)
- part_dec = float(f"0.{part_str}")
- part_bits = []
- for i in range(1, 9, 1):
- bit = "0"
- sub = 1 / (1 << i)
- if part_dec > sub:
- bit = "1"
- part_dec = part_dec - sub
- part_bits.append(bit)
- part_dec = int("".join(part_bits), 2)
-
- assert whole_dec <= 0xFF
- assert part_dec <= 0xFF
-
- print(f"0x{bytes([whole_dec, part_dec]).hex()}")
-
-
- def convert_from(hex_str: str) -> None:
- assert hex_str.startswith("0x")
- assert len(hex_str) == 6
-
- whole_bin = int(hex_str[2:4], 16)
- # TODO: support negatives
- # if whole_bin & (1 << 7):
- # whole_bin = -
- part_bin = int(hex_str[4:6], 16)
-
- part_dec = 0
- for i in range(1, 9, 1):
- mask = 1 << (8 - i)
- if part_bin & mask:
- part_dec += 1 / (1 << i)
-
- print(f"{whole_bin + part_dec}")
-
-
- def main() -> None:
- parser = argparse.ArgumentParser("convert_fixed_point")
- parser.add_argument("-d", "--decode", action="store_true")
- parser.add_argument("decimal")
-
- args = parser.parse_args()
- if args.decode:
- convert_from(args.decimal)
- else:
- convert_to(args.decimal)
-
-
- if __name__ == "__main__":
- main()
|