Как выполнить декремент байта равным 0 в Python?
Имеется кусок кода на Python:
>>> bt2 = bytearray(2)
>>> bt2[0] -= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)
>>> bt2[1] -= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)
Для меня это неожиданное поведение. В виду того, что у меня есть опыт разработки на языке ассемблера архитектуры x86-64 я ожидаю, что при уменьшении байта равным 0x0 на 1 получу значение 0xFF. А если увеличу байт равным 0xFF на 1, то получу 0x0. Но вместо этого вижу брошенное ValueError
.
У меня два вопроса:
- Есть ли в
Python
возможность эмулировать "байты", то есть при декременте 0x0 получить 0xFF ? - Почему в
Python
подобное поведение?
Ответы (2 шт):
Автор решения: SVBazuev
→ Ссылка
Как вариант:
def decrement_byte(b: int, flag: str) -> int:
if flag == "+":
return (b + 1) % 256
elif flag == "-":
return (b - 1) % 256
else:
raise ValueError("flag must be either '+' or '-'")
bt2 = bytearray(2)
print(bt2[0]) # Вывод: 0
bt2[0] = decrement_byte(bt2[0], "-")
print(bt2[0]) # Вывод: 255
bt2[0] = decrement_byte(bt2[0], "+")
print(bt2[0]) # Вывод: 0
Четкое ограничение значений байтов помогает избежать ошибок, связанных с переполнением и неожиданным поведением, которое может возникнуть в языках низкого уровня.
Автор решения: Amgarak
→ Ссылка
Можно воспользоваться numpy
import numpy as np
bt2 = np.zeros(2, dtype=np.uint8)
print(bt2) # [0 0]
bt2[0] -= 1
print(bt2) # [255 0]
bt2[1] -= 1
print(bt2) # [255 255]
bt2[0] += 1
print(bt2) # [ 0 255]
bt2[1] += 1
print(bt2) # [0 0]
bt2 = bytearray(bt2)
print(bt2) # bytearray(b'\x00\x00')