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-master.tar.gz scripts-master.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() | 
