Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import struct
- from typing import List, Generator
- def padding(bits: int, amount: int):
- """
- Return size of data and the required padding fot fit the alignment of bytes
- """
- size = bits * amount
- pad = 0
- if size % 8:
- pad = (2 ** math.ceil(math.log2(size))) - size
- return size, pad
- def pack(values: int, bits: int) -> bytes:
- """
- Pack the values by required bits.
- If a value is out of range, a ValueError is raised
- """
- size, pad = padding(bits, len(values))
- result = 0
- for idx, value in enumerate(values):
- if not 0 <= value < 2 ** bits:
- raise ValueError("Value is not in allowed range")
- result |= value << (idx * bits)
- return result.to_bytes(size + pad, "little")
- def unpack(data: bytes, bits: int) -> Generator[List[int], None, None]:
- """
- Unpack bytes to integers with given bits.
- """
- value = int.from_bytes(data, "little")
- while value:
- yield value & 0xFF
- value >>= bits
- data = pack([1,2,3,4,5], 12)
- print(list(unpack(data, 12)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement