Files
2019-11-07 13:14:04 -06:00

53 lines
1.6 KiB
Python

from bitstring import BitArray
def chunker(seq, size):
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
class BinToInt(object):
def __init__(self, size = 32, signed=True):
self.signed = signed
def process(self, bin_string, reverse_marshalling=False):
var = BitArray(bin_string)
chunked_bytes = [x for x in chunker(var, 8)]
ordered_bytes = []
for group in chunked_bytes if reverse_marshalling else reversed(chunked_bytes):
ordered_bytes.extend(group)
ordered_bytes = [x for x in reversed(ordered_bytes)]
if self.signed:
negative = ordered_bytes[-1]
else:
negative = False
# print([1 if x else 0 for x in ordered_bytes[:]])
if self.signed:
return self.convert_pos_int(ordered_bytes[:], negative)
else:
return self.convert_pos_int(ordered_bytes)
def convert_unsigned_int(self, val):
total_val = 0
digit_val = 1
for i in val:
total_val += digit_val if i else 0
digit_val *= 2
return total_val
def convert_pos_int(self, val, negative):
if negative:
val = [not x for x in val]
self.add_one_to_binary_int(val)
return self.convert_unsigned_int(val) * (-1 if negative else 1)
def add_one_to_binary_int(self, binary_list):
for i in range(len(binary_list)):
if binary_list[i]:
binary_list[i] = 0
else:
binary_list[i] = 1
break