diff options
author | terminaldweller <thabogre@gmail.com> | 2021-05-14 18:14:50 +0000 |
---|---|---|
committer | terminaldweller <thabogre@gmail.com> | 2021-05-14 18:14:50 +0000 |
commit | 6e528248414e330c9e25e81596ab47b8b8a5b701 (patch) | |
tree | e1aa41a7f3198eeac187e6177ec7d4a33db229d3 /bin/leb128 | |
download | scripts-6e528248414e330c9e25e81596ab47b8b8a5b701.tar.gz scripts-6e528248414e330c9e25e81596ab47b8b8a5b701.zip |
first commitmaster
Diffstat (limited to '')
-rwxr-xr-x | bin/leb128 | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/bin/leb128 b/bin/leb128 new file mode 100755 index 0000000..02a11e5 --- /dev/null +++ b/bin/leb128 @@ -0,0 +1,117 @@ +#!/bin/python3 + +import argparse +import code +import signal +import sys + + +def SigHandler_SIGINT(signum, frame): + print() + sys.exit(0) + + +def devibytes(val): + ret = [] + for byte in val.split(","): + ret.append(int(byte, 16)) + return bytes(ret) + + +def LEB128UnsignedDecode(bytelist): + result = 0 + shift = 0 + for byte in bytelist: + result |= (byte & 0x7f) << shift + if (byte & 0x80) == 0: + break + shift += 7 + return(result) + + +def LEB128SignedDecode(bytelist): + result = 0 + shift = 0 + for byte in bytelist: + result |= (byte & 0x7f) << shift + last_byte = byte + shift += 7 + if (byte & 0x80) == 0: + break + if last_byte & 0x40: + result |= - (1 << shift) + return(result) + + +def LEB128UnsignedEncode(int_val): + if int_val < 0: + raise Exception("value must not be negative") + elif int_val == 0: + return bytes([0]) + byte_array = bytearray() + while int_val: + byte = int_val & 0x7f + byte_array.append(byte | 0x80) + int_val >>= 7 + byte_array[-1] ^= 0x80 + return(byte_array) + + +def LEB128SignedEncode(int_val): + byte_array = bytearray() + while True: + byte = int_val & 0x7f + byte_array.append(byte | 0x80) + int_val >>= 7 + if (int_val == 0 and byte & 0x40 == 0) or (int_val == -1 and byte & 0x40): + byte_array[-1] ^= 0x80 + break + return(byte_array) + + +class Argparser(object): + def __init__(self): + parser = argparse.ArgumentParser() + parser.add_argument("--se", type=int, help="leb128 signed encode") + parser.add_argument("--ue", type=int, help="leb128 unsigned encode") + parser.add_argument( + "--sd", type=devibytes, help="leb128 signed decode. pass a string like ef1289.") + parser.add_argument( + "--ud", type=devibytes, help="leb128 unsigned decode. pass a string like ef1290") + self.args = parser.parse_args() + +# write code here + + +def premain(): + signal.signal(signal.SIGINT, SigHandler_SIGINT) + argparser = Argparser() + # here + if argparser.args.se: + res = LEB128SignedEncode(argparser.args.se) + for byte in res: + print(format(byte, "02x"), end=" ") + print() + if argparser.args.ue: + res = LEB128UnsignedEncode(argparser.args.ue) + for byte in res: + print(format(byte, "02x"), end=" ") + print() + if argparser.args.sd: + print(LEB128SignedDecode(argparser.args.sd)) + if argparser.args.ud: + print(LEB128UnsignedDecode(argparser.args.ud)) + + +def main(): + try: + premain() + except: + variables = globals().copy() + variables.update(locals()) + shell = code.InteractiveConsole(variables) + shell.interact(banner="LEB128 DEBUG REPL") + + +if __name__ == "__main__": + main() |