-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbin_utils.py
More file actions
73 lines (48 loc) · 2.02 KB
/
Copy pathbin_utils.py
File metadata and controls
73 lines (48 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import cv2
import numpy as np
def convert_to_bin(value, padding=8):
bit_repr = []
while(value > 0):
remainder = value % 2
value = value // 2
bit_repr = bit_repr + [remainder]
# pad the 0s to align to 8bits
leading_zeroes = [0] * (padding - len(bit_repr))
return leading_zeroes + bit_repr[::-1]
def get_bin_repr(number):
is_negative = number < 0
number = abs(number)
binary_repr = bin(number)[2::] # bin(int) give something like; 84 -> 0b1010111, so subtract the 0b from the repr
bin_bit_arr = list(map(int,list(binary_repr)))
size = len(bin_bit_arr)
if(is_negative):
bin_bit_arr = [ abs(v-1) for v in bin_bit_arr]
return (size,bin_bit_arr)
def bin_string_to_arr(binary_number):
return list(map(int,list(binary_number)))
def int_to_bit_array(number, size=8):
byte = [int(x) for x in format(number,'b')]
padding_bytes = size - (len(byte) % size) # Calculates the amount of padded bytes that will need
if(padding_bytes == size):
padding_bytes = 0
padded_msg = [0] * padding_bytes + byte # np.concatenate((msg, np.zeros(padding_bytes, dtype=int)))
return padded_msg
# TODO: There is probably a better way to do this
# TODO: https://pypi.org/project/bitarray/ -> this is faster than this
def bit_array_to_int(bit_arr, with_negative=False):
is_negative = False
if(len(bit_arr) < 1):
return 0
if(with_negative is True and bit_arr[0] == 0 ):
is_negative = True
# 0 - 1 -> -1, abs(-1) -> 1
# Cheap way to invert the binary ode
bit_arr = [ abs(v-1) for v in bit_arr]
reversed_bit_arr = bit_arr[::-1]
bit_int = sum([ value * pow(2, count) for count, value in enumerate(reversed_bit_arr) ])
return bit_int * -1 if is_negative else bit_int
if __name__ == '__main__':
(size, bitarray) = get_bin_repr(-2)
assert bitarray == [0,1], f"expected {[1,0]}, got {bitarray}"
print(int_to_bit_array(8))
print(convert_to_bin(8))