aboutsummaryrefslogtreecommitdiffstats
path: root/bin/leb128
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xbin/leb128117
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()