|
@ -0,0 +1,59 @@ |
|
|
|
|
|
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() |