Судя по комментариям, вам нужно преобразовать произвольное количество байтов в одно целое число. Поэтому \x00\x07\x71
следует рассматривать как одно двоичное число. Если вы хотите написать свою собственную функцию (что не так уж сложно), вы можете перебирать каждый байт и сдвигать его бит соответственно в зависимости от его позиции.
Для вашего примера a = b"\x00\x07\x71"
это расширяетсяна двоичное число a_b = 0b00000000_00000111_01110001
. Начнем с самого правого байта. Это не должно быть сдвигом битов вообще - мы добавляем это к результату. Переходим ко 2-му байту (\x07
). Это нужно сдвинуть влево на 1 байт, а затем добавить к результату. Наконец, самый левый байт должен быть сдвинут влево на 2 байта и затем добавлен к результату. Таким образом, наш от руки расчет дает (113 + 7 * 2 ^ 8 + 0 * 2 ^ 16 = 113 + 1792 + 0 = 1905)
def b_concat(bs):
"""
Performs binary concatenation of an arbitrary number of 8-bit values.
b_concat stands for binary-concatenation.
Input:
bs: bytes - A bytes string to convert to a single integer
Returns: The concatenated result as an integer. See examples below
"""
result = 0
n = len(bs)
for i in range(n):
result += (bs[n - i - 1] << (8*i)) # or you can use bs[::-1][i]
return result
tests = [b"\x00", b"\x01", b"\x02", b"\x00\x01", b"\x14\xa2", b"\x00\x07\x71"]
for test in tests:
print(f"{test} --> {b_concat(test)}")
или 1-лайнер, если вы предпочитаете
def b_concat(bs):
return sum([bs[::-1][i] << (8*i) for i in range(len(bs))])
В любом случае, вывод будет
b'\x00' --> 0
b'\x01' --> 1
b'\x02' --> 2
b'\x00\x01' --> 1
b'\x14\xa2' --> 5282
b'\x00\x07q' --> 1905