initial
This commit is contained in:
commit
3958f8cd1c
101
dumpbits.py
Executable file
101
dumpbits.py
Executable file
@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys, re, traceback
|
||||
from argparse import ArgumentParser
|
||||
|
||||
def convert(s):
|
||||
if s.lower().startswith('0x'):
|
||||
return int(s, 16)
|
||||
elif s.lower().startswith('0b'):
|
||||
return int(s, 2)
|
||||
else:
|
||||
return int(s)
|
||||
|
||||
class Table:
|
||||
def __init__(self, value, numbers):
|
||||
self.value = value
|
||||
self.numbers = numbers
|
||||
|
||||
def print(self):
|
||||
self.print_border()
|
||||
self.print_numbers()
|
||||
self.print_border()
|
||||
self.print_bits()
|
||||
self.print_border()
|
||||
|
||||
def print_border(self):
|
||||
total_w = 4 * len(self.numbers) + 2
|
||||
for i in range(total_w):
|
||||
c = '+' if i == 0 or i == total_w-1 else '-'
|
||||
print(c, end='')
|
||||
print()
|
||||
|
||||
def print_numbers(self):
|
||||
print('|', end='')
|
||||
for n in reversed(self.numbers):
|
||||
print(' %s ' % (str(n).rjust(2)), end='')
|
||||
print('|')
|
||||
|
||||
def print_bits(self):
|
||||
print('|', end='')
|
||||
for n in reversed(self.numbers):
|
||||
b = (self.value >> n) & 1
|
||||
print(' %s ' % (str(b).rjust(2)), end='')
|
||||
print('|')
|
||||
|
||||
def main():
|
||||
parser = ArgumentParser(description='inspect values by bits')
|
||||
parser.add_argument('-s', '--size', type=int, default=32, choices=(4, 8, 16, 32, 64),
|
||||
help='size')
|
||||
parser.add_argument('-r', '--range',
|
||||
help='range (e.g. 31:28), numbers are inclusive')
|
||||
parser.add_argument('value')
|
||||
args = parser.parse_args()
|
||||
|
||||
value = convert(args.value)
|
||||
|
||||
if value.bit_length() > args.size:
|
||||
raise Exception('bit length of %s is %d which is larger than specified size %d'
|
||||
% (args.value, value.bit_length(), args.size))
|
||||
|
||||
if args.range:
|
||||
r = re.search('^(\d+):(\d+)$', args.range)
|
||||
if not r:
|
||||
raise Exception('invalid range specified')
|
||||
|
||||
r_to = int(r.group(2))
|
||||
r_from = int(r.group(1))
|
||||
|
||||
if r_to < 0 or r_from < 0 or r_to >= args.size or r_from >= args.size:
|
||||
raise Exception('specified range is out of bounds')
|
||||
else:
|
||||
r_to = 0
|
||||
r_from = args.size - 1
|
||||
|
||||
numbers = range(r_to, r_from + 1)
|
||||
|
||||
table = Table(value, numbers)
|
||||
table.print()
|
||||
|
||||
print()
|
||||
print(' Input: %s' % args.value)
|
||||
print(' Binary: %s' % bin(value)[2:])
|
||||
print('Decimal: %d' % value)
|
||||
print(' Hex: %s' % hex(value)[2:])
|
||||
print()
|
||||
|
||||
if args.range:
|
||||
new_value = value >> r_to
|
||||
mask = (2 ** (r_from - r_to + 1) - 1)
|
||||
new_value &= mask
|
||||
|
||||
print(' [%d:%d]' % (r_from, r_to))
|
||||
print(' Binary: %s' % bin(new_value)[2:])
|
||||
print('Decimal: %d' % new_value)
|
||||
print(' Hex: %s' % hex(new_value)[2:])
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
main()
|
||||
except Exception as e:
|
||||
print("error: %s" % str(e))
|
||||
traceback.print_tb(e.__traceback__)
|
Loading…
x
Reference in New Issue
Block a user