Как преобразовать кортеж байтов в целое число и обратно? - PullRequest
0 голосов
/ 04 октября 2018

Проблема: Я хотел бы получить

(7,5,3) => 000001110000010100000011 => 460035  
  also the converse, i.e.,   
460035 => 000001110000010100000011 => (7,5,3)

Вот программа, которую я пробовал:

L=(7,5,3) # here L may vary each time.
a=0
for i in range(3):
    a=bin(a << 8) ^ bin(L[i])
print a  

Но выдает ошибку TypeError: unsupported operand type(s) for ^: 'str' and 'str'
Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Нет необходимости изобретать велосипед.Если бы вы видели ссылки на документы, которые я предоставил в комментариях, вы можете найти следующие полезные методы: int.from_bytes и int.to_bytes.Мы можем использовать их так:

input = (7, 5, 3)
result = int.from_bytes(input, byteorder='big')
print(result)
>>> 460035

print(tuple(result.to_bytes(3, byteorder='big')))
>>> (7, 5, 3)
0 голосов
/ 04 октября 2018

Вы должны выполнять битовые операции с числами, а не с преобразованными строками:

L=(7,5,3)
a=0
for i in L:
    a <<= 8
    a |= i
print(bin(a), a)

Это выводит:

0b1110000010100000011 460035

Сторнирование:

a = 460035
L = []
while True:
    L.append(a & 0xff)
    a >>= 8
    if not a:
        break
L = tuple(L[::-1])
print(L)

Этовыходы:

(7, 5, 3)
...