62 lines
1.3 KiB
Python
62 lines
1.3 KiB
Python
def int_to_bin(number, width = 32):
|
|
if number < 0:
|
|
number += 1 << width
|
|
i = width - 1
|
|
bits = ["\x00"] * width
|
|
while number and i >= 0:
|
|
bits[i] = "\x00\x01"[number & 1]
|
|
number >>= 1
|
|
i -= 1
|
|
return "".join(bits)
|
|
|
|
_bit_values = {"\x00" : 0, "\x01" : 1, "0" : 0, "1" : 1}
|
|
def bin_to_int(bits, signed = False):
|
|
number = 0
|
|
bias = 0
|
|
if signed and _bit_values[bits[0]] == 1:
|
|
bits = bits[1:]
|
|
bias = 1 << len(bits)
|
|
for b in bits:
|
|
number <<= 1
|
|
number |= _bit_values[b]
|
|
return number - bias
|
|
|
|
def swap_bytes(bits, bytesize = 8):
|
|
i = 0
|
|
l = len(bits)
|
|
output = [""] * ((l // bytesize) + 1)
|
|
j = len(output) - 1
|
|
while i < l:
|
|
output[j] = bits[i : i + bytesize]
|
|
i += bytesize
|
|
j -= 1
|
|
return "".join(output)
|
|
|
|
_char_to_bin = {}
|
|
_bin_to_char = {}
|
|
for i in range(256):
|
|
ch = chr(i)
|
|
bin = int_to_bin(i, 8)
|
|
_char_to_bin[ch] = bin
|
|
_bin_to_char[bin] = ch
|
|
_bin_to_char[bin] = ch
|
|
|
|
def encode_bin(data):
|
|
return "".join(_char_to_bin[ch] for ch in data)
|
|
|
|
def decode_bin(data):
|
|
assert len(data) & 7 == 0, "data length must be a multiple of 8"
|
|
i = 0
|
|
j = 0
|
|
l = len(data) // 8
|
|
chars = [""] * l
|
|
while j < l:
|
|
chars[j] = _bin_to_char[data[i:i+8]]
|
|
i += 8
|
|
j += 1
|
|
return "".join(chars)
|
|
|
|
|
|
|
|
|