dotfiles/bin/num

66 lines
1.5 KiB
Text
Raw Normal View History

2014-09-02 09:37:29 -07:00
#!/usr/bin/env python3
2023-03-22 14:39:07 -07:00
# Eryn Wells <eryn@erynwells.me>
2014-09-02 09:37:29 -07:00
2023-03-22 14:39:07 -07:00
import argparse
import json
2014-09-02 09:37:29 -07:00
import os.path
import sys
2023-03-22 14:39:07 -07:00
FORMATS = {
'bin': 2,
'oct': 8,
'dec': 10,
'hex': 16,
}
2014-09-02 09:37:29 -07:00
2023-03-27 15:44:40 -07:00
def convert_number_to_all_bases(n):
2023-03-22 14:39:07 -07:00
try:
n = n.lower()
if n.startswith('0x'):
base = 16
2023-03-27 15:44:40 -07:00
elif n.startswith('0o'):
2023-03-22 14:39:07 -07:00
base = 8
2023-03-27 15:44:40 -07:00
elif n.startswith('0b'):
2023-03-22 14:39:07 -07:00
base = 2
2023-03-27 15:44:40 -07:00
else:
base = 10
2023-03-22 14:39:07 -07:00
num = int(n, base=base)
except ValueError:
2023-03-27 15:44:40 -07:00
print(f'Error: cannot parse string as int: {n}', file=sys.stderr)
2023-03-22 14:39:07 -07:00
else:
return {
'bin': str(bin(num)[2:]),
'oct': str(oct(num)[2:]),
'dec': str(num),
2023-03-27 15:44:40 -07:00
'hex': str(hex(num)[2:]).upper(),
2023-03-22 14:39:07 -07:00
}
2014-09-02 09:37:29 -07:00
2023-03-22 14:39:07 -07:00
def parse_args(argv, *a, **kw):
parser = argparse.ArgumentParser(*a, **kw)
parser.add_argument('--ascii', '-a', action='store_true')
parser.add_argument('numbers', nargs='+')
args = parser.parse_args(argv)
return args
2014-09-02 09:37:29 -07:00
2023-03-22 14:39:07 -07:00
def main(argv):
args = parse_args(argv[1:], prog=argv[0])
2014-09-02 09:37:29 -07:00
2023-03-22 14:39:07 -07:00
output = {}
for n in args.numbers:
if args.ascii:
for c in n:
2023-03-27 15:44:40 -07:00
output.setdefault(c, convert_number_to_all_bases(str(ord(c))))
2014-09-02 09:37:29 -07:00
else:
2023-03-27 15:44:40 -07:00
output.setdefault(n, convert_number_to_all_bases(n))
2014-09-02 09:37:29 -07:00
2023-03-22 14:39:07 -07:00
json.dump(output, sys.stdout, indent=2)
print('\n')
2014-09-02 09:37:29 -07:00
2023-03-22 14:39:07 -07:00
return 0
2014-09-02 09:37:29 -07:00
if __name__ == '__main__':
2023-03-22 14:39:07 -07:00
import sys
result = main(sys.argv)
sys.exit(0 if not result else result)